我想要做的是,检测用户浏览器的语言并将其重定向到包含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 );
}
}
...
}
方法$ this-> newLocale()只检测用户是否应该重定向到另一种语言并返回新的语言代码(即DE或FR)。
问题出现了: 我使用资产来压缩js文件和jms / i18n-routing-bundle来做基于语言环境的路由。当内核侦听器切换区域设置时,页面会一遍又一遍地开始加载js文件。此外,有几个页面(即分析器,登录/注销等),其中不应发生重定向,因为它没有任何意义或打破了。
内核侦听器是进行此类重定向的正确位置还是有更好的位置。如何解决上述问题?
答案 0 :(得分:2)
在代码之前添加:
public function onKernelRequest(GetResponseEvent $event)
{
if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
return;
}
$request = $event->getRequest();
if ($request->getRequestFormat() !== 'html') {
return;
}
[CODE]