vendor/nucleos/user-bundle/src/EventListener/LocaleEventListener.php line 97

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. /*
  4.  * This file is part of the NucleosUserBundle package.
  5.  *
  6.  * (c) Christian Gripp <mail@core23.de>
  7.  *
  8.  * For the full copyright and license information, please view the LICENSE
  9.  * file that was distributed with this source code.
  10.  */
  11. namespace Nucleos\UserBundle\EventListener;
  12. use Nucleos\UserBundle\Event\UserEvent;
  13. use Nucleos\UserBundle\Model\LocaleAwareInterface;
  14. use Nucleos\UserBundle\NucleosUserEvents;
  15. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  16. use Symfony\Component\HttpFoundation\Request;
  17. use Symfony\Component\HttpKernel\Event\RequestEvent;
  18. use Symfony\Component\HttpKernel\KernelEvents;
  19. use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
  20. use Symfony\Component\Security\Http\SecurityEvents;
  21. use Symfony\Contracts\Translation\LocaleAwareInterface as LocaleAwareTranslator;
  22. use Twig\Environment;
  23. use Twig\Extension\CoreExtension;
  24. final class LocaleEventListener implements EventSubscriberInterface
  25. {
  26.     /**
  27.      * @var LocaleAwareTranslator
  28.      */
  29.     private $translator;
  30.     /**
  31.      * @var Environment
  32.      */
  33.     private $twig;
  34.     public function __construct(LocaleAwareTranslator $translatorEnvironment $twig)
  35.     {
  36.         $this->translator $translator;
  37.         $this->twig       $twig;
  38.     }
  39.     public static function getSubscribedEvents(): array
  40.     {
  41.         return [
  42.             NucleosUserEvents::SECURITY_IMPLICIT_LOGIN => 'onImplicitLogin',
  43.             SecurityEvents::INTERACTIVE_LOGIN          => 'onSecurityInteractiveLogin',
  44.             KernelEvents::REQUEST                      => [['onKernelRequest'20]],
  45.             NucleosUserEvents::USER_LOCALE_CHANGED     => 'onLocaleChanged',
  46.             NucleosUserEvents::USER_TIMEZONE_CHANGED   => 'onTimezoneChanged',
  47.         ];
  48.     }
  49.     public function onImplicitLogin(UserEvent $event): void
  50.     {
  51.         $user $event->getUser();
  52.         if (!$user instanceof LocaleAwareInterface || null === $event->getRequest()) {
  53.             return;
  54.         }
  55.         $this->setLocale($event->getRequest(), $user);
  56.         $this->setTimezone($event->getRequest(), $user);
  57.     }
  58.     public function onSecurityInteractiveLogin(InteractiveLoginEvent $event): void
  59.     {
  60.         $user $event->getAuthenticationToken()->getUser();
  61.         if (!$user instanceof LocaleAwareInterface) {
  62.             return;
  63.         }
  64.         $this->setLocale($event->getRequest(), $user);
  65.         $this->setTimezone($event->getRequest(), $user);
  66.     }
  67.     public function onKernelRequest(RequestEvent $event): void
  68.     {
  69.         $request $event->getRequest();
  70.         if (!$request->hasPreviousSession()) {
  71.             return;
  72.         }
  73.         $session $request->getSession();
  74.         if (null !== $locale $session->get('_locale')) {
  75.             $this->translator->setLocale($locale);
  76.             $request->setLocale($locale);
  77.         }
  78.         if (null !== $timezone $session->get('_timezone')) {
  79.             $this->setTwigTimezone($timezone);
  80.         }
  81.     }
  82.     public function onTimezoneChanged(UserEvent $event): void
  83.     {
  84.         $user $event->getUser();
  85.         if ($user instanceof LocaleAwareInterface && null !== $event->getRequest()) {
  86.             $this->setTimezone($event->getRequest(), $user);
  87.         }
  88.     }
  89.     public function onLocaleChanged(UserEvent $event): void
  90.     {
  91.         $user $event->getUser();
  92.         if ($user instanceof LocaleAwareInterface && null !== $event->getRequest()) {
  93.             $this->setLocale($event->getRequest(), $user);
  94.         }
  95.     }
  96.     private function setLocale(Request $requestLocaleAwareInterface $user): void
  97.     {
  98.         if (!$request->hasSession()) {
  99.             return;
  100.         }
  101.         $session $request->getSession();
  102.         $locale $user->getLocale();
  103.         if ('' === $locale || null === $locale) {
  104.             return;
  105.         }
  106.         $this->translator->setLocale($locale);
  107.         $request->setLocale($locale);
  108.         $session->set('_locale'$locale);
  109.     }
  110.     private function setTimezone(Request $requestLocaleAwareInterface $user): void
  111.     {
  112.         if (!$request->hasSession()) {
  113.             return;
  114.         }
  115.         $timezone $user->getTimezone();
  116.         if ('' === $timezone || null === $timezone) {
  117.             return;
  118.         }
  119.         $this->setTwigTimezone($timezone);
  120.         $session $request->getSession();
  121.         $session->set('_timezone'$timezone);
  122.     }
  123.     private function setTwigTimezone(string $timezone): void
  124.     {
  125.         $extension $this->twig->getExtension(CoreExtension::class);
  126.         if (!$extension instanceof CoreExtension) {
  127.             return;
  128.         }
  129.         // TODO: Find a way to manipulate all DateTimes for a user
  130. //        $extension->setTimezone($timezone);
  131.     }
  132. }