3
我想要做的是检测用户浏览器的语言并将其重定向到包含URL中语言环境的页面。检测语言环境并改变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)。
问题来了: 我正在使用资产压缩js文件和jms/i18n-routing-bundle来执行基于语言环境的路由。当内核监听器切换语言环境时,页面开始一遍又一遍地加载js文件。此外,还有几个页面(即分析器,登录/注销等),不应该发生重定向,因为它没有任何意义或休息时间。
内核侦听器是做这种重定向的合适位置还是有更好的地方。如何解决上述问题?
当然!非常感谢。有些基本信息甚至可以在[Cookbook](http://symfony.com/doc/current/book/internals.html#events)中找到。 – madc