Networking\InitCmsBundle\EventListener\LocaleListener::onKernelRequest PHP Метод

onKernelRequest() публичный Метод

public onKernelRequest ( GetResponseEvent $event )
$event Symfony\Component\HttpKernel\Event\GetResponseEvent
    public function onKernelRequest(GetResponseEvent $event)
    {
        $request = $event->getRequest();
        if (!$request) {
            return;
        }
        $patterns = $this->accessMap->getPatterns($request);
        //@todo find a better solution to know if we are in the admin area or not
        $localeType = in_array('ROLE_ADMIN', $patterns[0]) ? 'admin/_locale' : '_locale';
        if ($localeType == 'admin/_locale') {
            $locale = $request->getSession()->get($localeType);
        } else {
            $locale = $request->cookies->get($localeType);
        }
        /*
         * handle locale:
         * 1. priority: defined in cookie: set request attribute as symfony will set request->setLocale
         * 2. priority: defined in browser or default: set request attribute as symfony will set request->setLocale
         */
        if ($locale) {
            // there is a session -> use that
            $request->setLocale($locale);
        } else {
            // nothing set, get the preferred locale and use it
            $preferredLocale = $this->getPreferredLocale($request);
            $request->setLocale($preferredLocale);
        }
        if (null !== $this->router) {
            $this->router->getContext()->setParameter($localeType, $request->getLocale());
        }
    }

Usage Example

 public function testOnKernelRequest_WithoutPreviousSession()
 {
     $session = $this->getMockBuilder('\\Symfony\\Component\\HttpFoundation\\Session\\SessionInterface')->disableOriginalConstructor()->getMock();
     //		$session->expects($this->never())
     //			->method('get')
     //            ->with('_locale')
     //			->will($this->returnValue('xy'));
     $server = $this->getMock('\\Symfony\\Component\\HttpFoundation\\ServerBag');
     $server->expects($this->exactly(2))->method('get')->with('HTTP_ACCEPT_LANGUAGE')->will($this->returnValue('de-DE,de;q=0.8,jp'));
     $request = $this->getMockBuilder('Symfony\\Component\\HttpFoundation\\Request')->getMock();
     $parameterBag = $this->getMockBuilder('Symfony\\Component\\HttpFoundation\\ParameterBag')->disableOriginalConstructor()->getMock();
     $request->attributes = $parameterBag;
     $request->server = $server;
     $request->cookies = $parameterBag;
     $request->expects($this->never())->method('setDefaultLocale');
     $request->expects($this->once())->method('getLocale');
     $event = $this->getMockBuilder('Symfony\\Component\\HttpKernel\\Event\\GetResponseEvent')->disableOriginalConstructor()->getMock();
     $event->expects($this->once())->method('getRequest')->will($this->returnValue($request));
     $accessMapStub = $this->getMock('\\Symfony\\Component\\Security\\Http\\AccessMap');
     $accessMapStub->expects($this->once())->method('getPatterns')->will($this->returnValue(array(array('no valid data'))));
     // request context
     $context = $this->getMockBuilder('Symfony\\Component\\Routing\\RequestContext')->disableOriginalConstructor()->getMock();
     $context->expects($this->once())->method('setParameter')->with('_locale');
     // router
     $router = $this->getMockBuilder('Symfony\\Component\\Routing\\Router')->disableOriginalConstructor()->getMock();
     $router->expects($this->once())->method('getContext')->will($this->returnValue($context));
     $listener = new LocaleListener($accessMapStub, array(array('locale' => 'de')), 'en', $router);
     $listener->onKernelRequest($event);
 }