src/EventSubscriber/LocaleSubscriber.php line 38

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use GeoIp2\Database\Reader;
  4. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  5. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\HttpKernel\Event\RequestEvent;
  8. use Symfony\Component\HttpKernel\KernelEvents;
  9. class LocaleSubscriber implements EventSubscriberInterface
  10. {
  11.     private $availableLocales;
  12.     private $defaultLocale;
  13.     /** @var Reader */
  14.     private $geoip;
  15.     /**
  16.      * LocaleSubscriber constructor.
  17.      */
  18.     public function __construct(ParameterBagInterface $parameterBagReader $geoip)
  19.     {
  20.         $this->availableLocales explode('|'$parameterBag->get('available_locales'));
  21.         $this->defaultLocale $parameterBag->get('default_locale');
  22.         $this->geoip $geoip;
  23.     }
  24.     public static function getSubscribedEvents()
  25.     {
  26.         return [
  27.             KernelEvents::REQUEST => [['onKernelRequest'20]]
  28.         ];
  29.     }
  30.     public function onKernelRequest(RequestEvent $event) {
  31.         $request $event->getRequest();
  32.         if (!$event->isMainRequest()) {
  33.             return null;
  34.         }
  35.         $locale null;
  36.         // get from url
  37.         $uriLocale $this->getLocaleFromUri($request);
  38.         $locale $uriLocale ?? null;
  39.         // get from ip
  40.         $ipLocale $this->getLocaleFromIp($request);
  41.         $locale $ipLocale ?? null;
  42.         // get default locale
  43.         $locale $locale ?? $this->defaultLocale;
  44.         $request->setLocale($locale);
  45.     }
  46.     private function getLocaleFromUri(Request $request) {
  47.         $uri $request->getRequestUri();
  48.         $uriParts explode('/'$uri);
  49.         $localePart null;
  50.         if (count($uriParts) > 1) {
  51.             $localePart $uriParts[1];
  52.         }
  53.         $availableLocales $this->availableLocales;
  54.         if (!in_array($localePart$availableLocales)) {
  55.             return null;
  56.         }
  57.         return $localePart;
  58.     }
  59.     private function getLocaleFromIp(Request $request) {
  60.         $ip $request->getClientIp();
  61.         // return null if localhost
  62.         if (in_array($ip, ['::1''127.0.0.1'])) {
  63.             return null;
  64.         }
  65.         $availableLocales $this->availableLocales;
  66.         try {
  67.             $country $this->geoip->country($ip);
  68.             $countryIso strtolower($country->country->isoCode);
  69.             if (!in_array($countryIso$availableLocales)) {
  70.                 return null;
  71.             }
  72.             return $countryIso;
  73.         } catch (\Exception $e) {
  74.             return null;
  75.         }
  76.     }
  77. }