src/Event/SiteEventSubScriber.php line 35

Open in your IDE?
  1. <?php
  2. namespace App\Event;
  3. use Symfony\Component\DependencyInjection\ParameterBag\ContainerBagInterface;
  4. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  5. use Symfony\Component\HttpFoundation\Request;
  6. use Symfony\Component\HttpKernel\Event\RequestEvent;
  7. use Symfony\Component\HttpKernel\KernelEvents;
  8. use function str_starts_with;
  9. /**
  10.  * EVENT SUBSCRIBER ONLY FOR request.host=hosts.boarding
  11.  */
  12. class SiteEventSubScriber implements EventSubscriberInterface {
  13.   /**
  14.    * @var ContainerBagInterface
  15.    */
  16.   private $params;
  17.   const DEFAULT_LANGUAGE 'fr';
  18.   const SUPPORTED_LANGUAGES = ['fr''en'];
  19.   public function __construct(ContainerBagInterface $params) {
  20.     $this->params $params;
  21.   }
  22.   public static function getSubscribedEvents() {
  23.     return [
  24.         KernelEvents::REQUEST => ['onKernelRequest'100],
  25.     ];
  26.   }
  27.   public function onKernelRequest(RequestEvent $event) {
  28.     $r $event->getRequest();
  29.     if($r->getHost() != $this->params->get('hosts.boarding')) return;
  30.     $this->autoSetLanguage($r);
  31.   }
  32.   /**
  33.    * Set language based on HTTP Accept-Language header
  34.    * @param Request $r
  35.    */
  36.   protected function autoSetLanguage(Request $r) {
  37.     $r->setLocale(self::DEFAULT_LANGUAGE);
  38.     $acceptLanguage $r->headers->get('Accept-Language');
  39.     if(!$acceptLanguage) return;
  40.     $languages preg_split('/[;,]/'$acceptLanguage);
  41.     foreach($languages as $lang) {
  42.       if(str_starts_with($lang'q=')) continue;
  43.       $lang preg_replace('/-.*$/'''$lang);
  44.       if(in_array($langself::SUPPORTED_LANGUAGES)) {
  45.         $r->setLocale($lang);
  46.         return;
  47.       }
  48.     }
  49.   }
  50. }