Можно ли изменить сообщение перенаправления по умолчанию в Symfony?

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

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

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

Solutions Collecting From Web of "Можно ли изменить сообщение перенаправления по умолчанию в Symfony?"

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

В этом примере я буду использовать шаблон 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; } }