我正在使用控制器在用户更改网站语言后重定向.
return $this->redirect($this->generateUrl($_redirectTo), 301);
Run Code Online (Sandbox Code Playgroud)
问题是,显示"重定向到/ path /"的消息,我不想这样做.是否可以更改该消息?
Tou*_*uki 13
Controller::redirect()
实际上,该方法是创建一个新RedirectResponse
对象.
默认模板被硬编码到响应中,但这里有一些解决方法.
在这个例子中,我将使用TWIG模板,因此我需要
@templating
服务,但您可以使用任何想要呈现页面的内容.
首先,使用您想要的内容将模板创建301.html.twig
到您的模板中Acme/FooBundle/Resources/views/Error/
.
@AcmeFooBundle/Resources/views/Error/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>
Run Code Online (Sandbox Code Playgroud)
如果你希望这个模板是全局的,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
Run Code Online (Sandbox Code Playgroud)
Acme\FooBundle\Listener\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);
}
}
Run Code Online (Sandbox Code Playgroud)
如果要直接从操作更改模板,请使用此选项.
修改仅适用于给定的操作,而不适用于您的应用程序.
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;
}
}
Run Code Online (Sandbox Code Playgroud)