2013-08-13 4 views
4

Я использую контроллер для перенаправления моих пользователей после того, как они изменили язык веб-сайта.Можно ли изменить сообщение перенаправления по умолчанию в Symfony?

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

Проблема заключается в том, что появляется сообщение «перенаправление на/путь /», которое я не хочу. Можно ли изменить это сообщение?

ответ

12

Метод Controller::redirect() фактически является созданием нового объекта RedirectResponse.
Шаблон по умолчанию hard-coded в ответ, но вот некоторые обходные пути.

В этом примере я буду использовать шаблон TWIG, поэтому мне нужно @templating обслуживание, но вы можете использовать все, что вы хотите, чтобы отобразить страницу.

Во-первых, создать шаблон 301.html.twig в ваш Acme/FooBundle/Resources/views/Error/ с содержанием вы хотите.

@ 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
Это означает, что вы все равно можете использовать return $this->redirect в вашем контроллере, будет затронуто только содержание ответа.

services.yml

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

Acme \ 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

Это работает, спасибо большое! –

Смежные вопросы