Вход Регистрация
Файл: vendor/symfony/http-kernel/EventListener/LocaleListener.php
Строк: 149
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace SymfonyComponentHttpKernelEventListener;

use 
SymfonyComponentEventDispatcherEventSubscriberInterface;
use 
SymfonyComponentHttpFoundationRequest;
use 
SymfonyComponentHttpFoundationRequestStack;
use 
SymfonyComponentHttpKernelEventFinishRequestEvent;
use 
SymfonyComponentHttpKernelEventKernelEvent;
use 
SymfonyComponentHttpKernelEventRequestEvent;
use 
SymfonyComponentHttpKernelKernelEvents;
use 
SymfonyComponentRoutingRequestContextAwareInterface;

/**
 * Initializes the locale based on the current request.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @final
 */
class LocaleListener implements EventSubscriberInterface
{
    private ?
RequestContextAwareInterface $router;
    private 
string $defaultLocale;
    private 
RequestStack $requestStack;
    private 
bool $useAcceptLanguageHeader;
    private array 
$enabledLocales;

    public function 
__construct(RequestStack $requestStackstring $defaultLocale 'en', ?RequestContextAwareInterface $router nullbool $useAcceptLanguageHeader false, array $enabledLocales = [])
    {
        
$this->defaultLocale $defaultLocale;
        
$this->requestStack $requestStack;
        
$this->router $router;
        
$this->useAcceptLanguageHeader $useAcceptLanguageHeader;
        
$this->enabledLocales $enabledLocales;
    }

    public function 
setDefaultLocale(KernelEvent $event): void
    
{
        
$event->getRequest()->setDefaultLocale($this->defaultLocale);
    }

    public function 
onKernelRequest(RequestEvent $event): void
    
{
        
$request $event->getRequest();

        
$this->setLocale($request);
        
$this->setRouterContext($request);
    }

    public function 
onKernelFinishRequest(FinishRequestEvent $event): void
    
{
        if (
null !== $parentRequest $this->requestStack->getParentRequest()) {
            
$this->setRouterContext($parentRequest);
        }
    }

    private function 
setLocale(Request $request): void
    
{
        if (
$locale $request->attributes->get('_locale')) {
            
$request->setLocale($locale);
        } elseif (
$this->useAcceptLanguageHeader) {
            if (
$request->getLanguages() && $preferredLanguage $request->getPreferredLanguage($this->enabledLocales)) {
                
$request->setLocale($preferredLanguage);
            }
            
$request->attributes->set('_vary_by_language'true);
        }
    }

    private function 
setRouterContext(Request $request): void
    
{
        
$this->router?->getContext()->setParameter('_locale'$request->getLocale());
    }

    public static function 
getSubscribedEvents(): array
    {
        return [
            
KernelEvents::REQUEST => [
                [
'setDefaultLocale'100],
                
// must be registered after the Router to have access to the _locale
                
['onKernelRequest'16],
            ],
            
KernelEvents::FINISH_REQUEST => [['onKernelFinishRequest'0]],
        ];
    }
}
Онлайн: 2
Реклама