src/EventListener/UserLocaleSubscriber.php line 46

Open in your IDE?
  1. <?php
  2. // src/EventListener/UserLocaleSubscriber.php
  3. namespace App\EventListener;
  4. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  5. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  6. use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
  7. use Symfony\Component\Security\Http\SecurityEvents;
  8. use Symfony\Component\HttpKernel\Event\GetResponseEvent;
  9. use Symfony\Component\HttpKernel\KernelEvents;
  10. /**
  11.  * Stores the locale of the user in the session after the
  12.  * login. This can be used by the LocaleSubscriber afterwards.
  13.  */
  14. class UserLocaleSubscriber implements EventSubscriberInterface
  15. {
  16.     private $session;
  17.     private $defaultLocale;
  18.     public function __construct(SessionInterface $session$defaultLocale 'en')
  19.     {
  20.         $this->session $session;
  21.         $this->defaultLocale $defaultLocale;
  22.     }
  23.     public function onInteractiveLogin(InteractiveLoginEvent $event)
  24.     {
  25.         $user $event->getAuthenticationToken()->getUser();
  26.         if (null !== $user->getLocale()) {
  27.             $this->session->set('_locale'$user->getLocale());
  28.         }
  29.     }
  30.     public static function getSubscribedEvents()
  31.     {
  32.         return [
  33.             SecurityEvents::INTERACTIVE_LOGIN => 'onInteractiveLogin',
  34.             KernelEvents::REQUEST => [['onKernelRequest'20]],
  35.         ];
  36.     }
  37.     public function onKernelRequest(GetResponseEvent $event)
  38.     {
  39.         $request $event->getRequest();
  40.         if (!$request->hasPreviousSession()) {
  41.             return;
  42.         }
  43.         // try to see if the locale has been set as a _locale routing parameter
  44.         if ($locale $request->attributes->get('_locale')) {
  45.             $request->getSession()->set('_locale'$locale);
  46.         } else {
  47.             // if no explicit locale has been set on this request, use one from the session
  48.             $request->setLocale($request->getSession()->get('_locale'$this->defaultLocale));
  49.         }
  50.     }
  51. }