是否可以更改Symfony中的默认重定向消息?

时间:2013-08-13 09:12:29

标签: php symfony

我使用控制器在用户更改网站语言后重定向用户。

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

问题是,显示“重定向到/ path /”的消息,我不想这样做。 是否可以更改该消息?

1 个答案:

答案 0 :(得分:13)

方法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;
    }
}