2012-06-22 72 views
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文件。此外,还有几个页面(即分析器,登录/注销等),不应该发生重定向,因为它没有任何意义或休息时间。

内核侦听器是做这种重定向的合适位置还是有更好的地方。如何解决上述问题?

回答

2

添加,您的代码之前:

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

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

    [CODE] 
+0

当然!非常感谢。有些基本信息甚至可以在[Cookbook](http://symfony.com/doc/current/book/internals.html#events)中找到。 – madc