Метод 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;
}
}
Спасибо за ваш ответ! – pangi
Это работает, спасибо большое! –