4

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

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

问题是,出现了“重定向到 /path/”的消息,这是我不想看到的。是否可以更改该消息?

4

1 回答 1

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>

从事件监听器

如果你希望这个模板是全局的,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\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);
    }
}

从控制器

如果您想直接从操作更改模板,请使用此选项。
修改仅适用于给定的操作,而不适用于您的应用程序。

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;
    }
}
于 2013-08-13T09:41:08.437 回答