2013-08-13 5 views
4

나는 그들이 웹 사이트의 언어를 변경 한 후에 내 사용자를 리디렉션하는 컨트롤러를 사용하고 있습니다.Symfony에서 기본 리디렉션 메시지를 변경할 수 있습니까?

return $this->redirect($this->generateUrl($_redirectTo), 301); 

문제는 "원하지 않는/경로 /로 리다이렉트하는"메시지가 표시된다는 것입니다. 해당 메시지를 변경할 수 있습니까?

답변

12

실제로 Controller::redirect() 메서드는 새로운 RedirectResponse 개체를 만듭니다.
기본 템플릿은 응답에 hard-coded이지만 여기에 몇 가지 해결 방법이 있습니다.

이 예제에서는 따라서 나는 @templating 서비스를 필요 나뭇 가지 템플릿을 사용하지만 당신은 당신이 페이지를 렌더링하기 위해 원하는대로 사용할 수 있습니다.

첫째, 당신이 원하는 내용에 Acme/FooBundle/Resources/views/Error/ 당신에 템플릿 301.html.twig을 만들 수 있습니다. 이벤트 리스너에서

AcmeFooBundle/자원 @/뷰/오류/301.html.twig

<!DOCTYPE HTML> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
     <meta http-equiv="refresh" content="1;url={{ uri }}" /> 
    </head> 
    <body> 
     You are about to be redirected to {{ uri }} 
    </body> 
</html> 

이 서식 할 수있는 RedirectResponse에 글로벌 싶은 경우 응답을 수신하고 주어진 응답이 인스턴스인지 확인하는 이벤트 리스너를 만듭니다. RedirectResponse
즉,를 계속 사용할 수 있습니다.컨트롤러에서 응답 내용 만 영향을받습니다.

services.yml

services: 
    acme.redirect_listener: 
     class: Acme\FooBundle\Listener\RedirectListener 
     arguments: [ @templating ] 
     tags: 
      - 
       name: kernel.event_listener 
       event: kernel.response 
       method: onKernelResponse 

한국 전기 \ FooBundle \ 리스너 \ RedirectListener 컨트롤러

사용에서

use Symfony\Component\Templating\EngineInterface; 
use Symfony\Component\HttpKernel\Event\FilterResponseEvent; 
use Symfony\Component\HttpFoundation\RedirectResponse; 

class RedirectListener 
{ 
    protected $templating; 

    public function __construct(EngineInterface $templating) 
    { 
     $this->templating = $templating; 
    } 

    public function onKernelResponse(FilterResponseEvent $event) 
    { 
     $response = $event->getResponse(); 

     if (!($response instanceof RedirectResponse)) { 
      return; 
     } 

     $uri = $response->getTargetUrl(); 
     $html = $this->templating->render(
      'AcmeFooBundle:Error:301.html.twig', 
      array('uri' => $uri) 
     ); 

     $response->setContent($html); 
    } 
} 

이것은 작업에서 템플릿을 직접 변경하려는 경우에 사용됩니다.
수정 사항은 특정 작업에 대해서만 사용할 수 있으며 애플리케이션에 전역 적으로 적용되지는 않습니다.

use Symfony\Component\HttpFoundation\RedirectResponse; 
use Symfony\Component\HttpKernel\Event\FilterResponseEvent; 

class FooController extends Controller 
{ 
    public function fooAction() 
    { 
     $uri = $this->generateUrl($_redirectTo); 

     $response = new RedirectResponse($uri, 301); 
     $response->setContent($this->render(
      'AcmeFooBundle:Error:301.html.twig', 
      array('uri' => $uri) 
     )); 

     return $response; 
    } 
} 

+0

답장을 보내 주셔서 감사합니다. – pangi

+0

정말 고마워요! –

관련 문제