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

pan*_*ngi 4 php symfony

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

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)