检测区域设置和更改URL(重定向),包括区域(Detect locale and alter url

2019-06-25 16:22发布

我想要做的是,检测用户浏览器的语言和重定向他包含URL的区域设置的页面。

我认为,最简单的办法是,注册一个内核监听器。 所以这是我做过什么:

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

KernelRequestListener.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 );
    }
    }
...
}

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

这里谈到的问题:我使用assetics压缩js文件和JMS / i18n中路由束做基于地区的路由。 当内核听众切换区域设置,页面开始一遍又一遍的加载JS文件。 同时,有多个页面(即探查,登录/退出等),其中,因为它是没有意义或中断smthing没有重定向应该发生。

是一个内核听众做这样的重定向正确的地方或者有没有更好的地方。 如何解决上述问题?

Answer 1:

添加,您的代码之前:

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

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

    [CODE]


文章来源: Detect locale and alter url (redirect) to include locale