src/EventSubscriber/LocaleSubscriber.php line 45

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\EventSubscriber;
  4. use Doctrine\ORM\EntityManagerInterface;
  5. use phpDocumentor\Reflection\Types\This;
  6. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  7. use Symfony\Component\HttpFoundation\Cookie;
  8. use Symfony\Component\HttpFoundation\RedirectResponse;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  11. use Symfony\Component\HttpKernel\Event\RequestEvent;
  12. use Symfony\Component\HttpKernel\KernelEvents;
  13. use Symfony\Component\Routing\Matcher\UrlMatcherInterface;
  14. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  15. class LocaleSubscriber implements EventSubscriberInterface
  16. {
  17.     private $defaultLocale;
  18.     /**
  19.      * @var UrlMatcherInterface
  20.      */
  21.     private $urlMatcher;
  22.     /** @var string[] */
  23.     private $allowedLanguages = ['en''es''it''fr'];
  24.     /**
  25.      * LocaleSubscriber constructor.
  26.      * @param UrlMatcherInterface $urlMatcher
  27.      * @param string $defaultLocale
  28.      */
  29.     public function __construct(UrlMatcherInterface $urlMatcher$defaultLocale 'en')
  30.     {
  31.         $this->defaultLocale $defaultLocale;
  32.         $this->urlMatcher $urlMatcher;
  33.     }
  34.     /**
  35.      * @param RequestEvent $event
  36.      */
  37.     public function onKernelRequest(RequestEvent $event)
  38.     {
  39.         $request $event->getRequest();
  40.         if ($request->attributes->get('_route') == '_wdt') {
  41.             return;
  42.         }
  43.         if ($request->getPathInfo() && strpos($request->getPathInfo(), '_wdt') !== false) {
  44.             return;
  45.         }
  46.         if ($request->attributes->get('_route') && strpos($request->attributes->get('_route'), '_profiler') !== false) {
  47.             return;
  48.         }
  49.         $newUrl  strtolower($request->getPathInfo());
  50.         if (preg_match_all("/js\/routing/"$newUrl) || preg_match_all("/[a-z]{2}\/notifications\/widget/"$newUrl)
  51.             || preg_match_all("#/_fragment#"$newUrl)) {
  52.             return;
  53.         }
  54.         $session $request->getSession();
  55.         $cookieForLanguage $request->cookies->get('preferred_language');
  56.         if ($request->attributes->get('path') === '/invalid-route') {
  57.             $lang $this->defaultLocale;
  58.             if ($cookieForLanguage) {
  59.                 $lang $cookieForLanguage;
  60.                 $this->setSessionLocale($session$cookieForLanguage);
  61.             }
  62.             $event->setResponse(new RedirectResponse($newUrl $lang));
  63.         } else {
  64.             $urlLang $this->extractLanguage($newUrl);
  65.             $sessionLocale $session->get('_locale'$this->defaultLocale);
  66.             $attrLocale $request->attributes->get('_locale');
  67.             $localToSet $this->defaultLocale;
  68.             // In case a not valid language has been set in the url, default one will be set
  69.             // and request will be redirect to same url with default language
  70.             if (!$this->isValidLanguage($urlLang)) {
  71.                 $newUrlNoLocale $this->replaceLocale($this->defaultLocale$newUrl);
  72.                 $event->setResponse(new RedirectResponse($newUrlNoLocale));
  73.             } elseif ($attrLocale && $this->isValidLanguage($attrLocale)) {
  74.                 $localToSet $attrLocale;
  75.             } elseif ($sessionLocale !== $urlLang) {
  76.                 $localToSet $urlLang;
  77.             }
  78.             $this->setSessionLocale($session$localToSet);
  79.         }
  80.     }
  81.     /**
  82.      * @return array
  83.      */
  84.     public static function getSubscribedEvents()
  85.     {
  86.         return [
  87.             // must be registered before (i.e. with a higher priority than) the default Locale listener
  88.             KernelEvents::REQUEST => [['onKernelRequest'20]],
  89.         ];
  90.     }
  91.     /**
  92.      * @param string $newUrl
  93.      * @return mixed
  94.      */
  95.     private function extractLanguage(string $newUrl)
  96.     {
  97.         $languageInUrl explode("/"substr($newUrl1));
  98.         return $languageInUrl[0];
  99.     }
  100.     /**
  101.      * @param string $language
  102.      * @param string $url
  103.      * @return string
  104.      */
  105.     private function replaceLocale(string $languagestring $url)
  106.     {
  107.         $indexAfterLocale strpos(substr($url1), "/") + 1;
  108.         return "/".$language.substr($url$indexAfterLocale);
  109.     }
  110.     private function isValidLanguage(string $localeInNewUrl): bool
  111.     {
  112.         return in_array($localeInNewUrl$this->allowedLanguages);
  113.     }
  114.     /**
  115.      * @param SessionInterface $session
  116.      * @param string $localToSet
  117.      */
  118.     private function setSessionLocale(SessionInterface $sessionstring $localToSet): void
  119.     {
  120.         $session->set('_locale'$localToSet);
  121.     }
  122. }