src/EventSubscriber/RedirectToPreferredLocaleSubscriber.php line 64

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the Symfony package.
  4.  *
  5.  * (c) Fabien Potencier <fabien@symfony.com>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. namespace App\EventSubscriber;
  11. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  12. use Symfony\Component\HttpFoundation\RedirectResponse;
  13. use Symfony\Component\HttpKernel\Event\RequestEvent;
  14. use Symfony\Component\HttpKernel\KernelEvents;
  15. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  16. use function Symfony\Component\String\u;
  17. /**
  18.  * When visiting the homepage, this listener redirects the user to the most
  19.  * appropriate localized version according to the browser settings.
  20.  *
  21.  * See https://symfony.com/doc/current/components/http_kernel.html#the-kernel-request-event
  22.  *
  23.  * @author Oleg Voronkovich <oleg-voronkovich@yandex.ru>
  24.  */
  25. class RedirectToPreferredLocaleSubscriber implements EventSubscriberInterface
  26. {
  27.     private $urlGenerator;
  28.     private $locales;
  29.     private $defaultLocale;
  30.     public function __construct(UrlGeneratorInterface $urlGeneratorstring $localesstring $defaultLocale null)
  31.     {
  32.         $this->urlGenerator $urlGenerator;
  33.         $this->locales explode('|'trim($locales));
  34.         if (empty($this->locales)) {
  35.             throw new \UnexpectedValueException('The list of supported locales must not be empty.');
  36.         }
  37.         $this->defaultLocale $defaultLocale ?: $this->locales[0];
  38.         if (!\in_array($this->defaultLocale$this->localestrue)) {
  39.             throw new \UnexpectedValueException(sprintf('The default locale ("%s") must be one of "%s".'$this->defaultLocale$locales));
  40.         }
  41.         // Add the default locale at the first position of the array,
  42.         // because Symfony\HttpFoundation\Request::getPreferredLanguage
  43.         // returns the first element when no an appropriate language is found
  44.         array_unshift($this->locales$this->defaultLocale);
  45.         $this->locales array_unique($this->locales);
  46.     }
  47.     public static function getSubscribedEvents(): array
  48.     {
  49.         return [
  50.             KernelEvents::REQUEST => 'onKernelRequest',
  51.         ];
  52.     }
  53.     public function onKernelRequest(RequestEvent $event): void
  54.     {
  55.         $request $event->getRequest();
  56.         // Ignore sub-requests and all URLs but the homepage
  57.         if (!$event->isMainRequest() || '/' !== $request->getPathInfo()) {
  58.             return;
  59.         }
  60.         // Ignore requests from referrers with the same HTTP host in order to prevent
  61.         // changing language for users who possibly already selected it for this application.
  62.         $referrer $request->headers->get('referer');
  63.         if (null !== $referrer && u($referrer)->ignoreCase()->startsWith($request->getSchemeAndHttpHost())) {
  64.             return;
  65.         }
  66.         $preferredLanguage $request->getPreferredLanguage($this->locales);
  67.         if ($preferredLanguage !== $this->defaultLocale) {
  68.             $response = new RedirectResponse($this->urlGenerator->generate('homepage', ['_locale' => $preferredLanguage]));
  69.             $event->setResponse($response);
  70.         }
  71.     }
  72. }