3

我想要做的是,检测用户浏览器的语言并将他重定向到包含 url 中的语言环境的页面。

我想,最简单的方法是注册一个内核监听器。这就是我所做的:

services:
    kernel__request_listener:
        class: Me\MainBundle\Listener\KernelRequestListener
        tags:
            - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
        calls:
            - [ setContainer, [ @service_container ] ]

内核请求监听器.php

...
/**
 * @Service
 */
class KernelRequestListener
{
    /**
     * @Observe("kernel.request")
     */
    public function onKernelRequest( GetResponseEvent $response )
    {

    if( $newLocale = $this->newLocale() )
    {
        $parmArray = $request->get('_route_params');
        $parmArray['_locale'] = $newLocale;

        $redirectResponse = new RedirectResponse( $this->getContainer()->get('router')->generate($request->get('_route'), $parmArray) );
        $redirectResponse->headers->setCookie( new Cookie('b_locale', $newLocale, time() + 2592000) );

        $response->setResponse( $redirectResponse );
    }
    }
...
}

$this->newLocale() 方法只是检测用户是否应该被重定向到另一种语言并返回新的语言代码(即 DE 或 FR)。

问题来了:我正在使用资产来压缩 js 文件和 jms/i18n-routing-bundle 来执行基于语言环境的路由。当内核侦听器切换语言环境时,页面开始一遍又一遍地加载 js 文件。此外,有几个页面(即分析器、登录/注销等)不应该发生重定向,因为它没有任何意义或破坏 smthing。

内核侦听器是进行此类重定向的正确位置还是有更好的位置。如何解决以上问题?

4

1 回答 1

3

在您的代码之前添加:

public function onKernelRequest(GetResponseEvent $event)
{
    if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
        return;
    }

    $request = $event->getRequest();
    if ($request->getRequestFormat() !== 'html') {
        return;
    }

    [CODE]
于 2012-07-13T10:26:09.893 回答