2012-06-22 1 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); 
    } 
    } 
... 
} 

방법의 $ this-> 사용자가 다른 언어로 재와 새로운 언어 코드를 반환 할 필요가있는 경우 newLocale()는 단지 감지 (예 : DE 또는 FR).

여기에 문제가 있습니다. jail 파일을 압축하기 위해 assetsics를 사용하고 로케일 기반 라우팅을 수행하기 위해 jms/i18n-routing-bundle을 사용하고 있습니다. 커널 리스너가 로케일을 전환하면 페이지가 js 파일을 계속해서 다시로드하기 시작합니다. 또한 리디렉션이 감지되지 않거나 smthing을 일으키지 않아 리디렉션이 발생하지 않는 여러 페이지 (예 : 프로필러, 로그인/로그 아웃 등)가 있습니다.

커널 수신기가 이러한 리다이렉션을 수행하기에 적합한 장소인가, 아니면 더 좋은 곳입니까? 위의 문제를 해결하는 방법?

답변

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