我使用控制器在用户更改网站语言后重定向用户。
return $this->redirect($this->generateUrl($_redirectTo), 301);
问题是,显示“重定向到/ path /”的消息,我不想这样做。 是否可以更改该消息?
答案 0 :(得分:13)
方法Controller::redirect()
实际上是创建一个新的RedirectResponse
对象
3}}默认模板位于响应中,但这里有一些解决方法。
在这个例子中,我将使用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;
}
}