src/EventSubscriber/TimezoneSubscriber.php line 24

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace App\EventSubscriber;
  3. use Symfony\Component\DependencyInjection\{Exception\ParameterNotFoundExceptionParameterBag\ParameterBagInterface};
  4. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  5. use Symfony\Component\HttpKernel\{Event\RequestEventKernelEvents};
  6. class TimezoneSubscriber implements EventSubscriberInterface
  7. {
  8.     public const DEFAULT_TIMEZONE 'UTC';
  9.     public function __construct(private ParameterBagInterface $parameterBag)
  10.     {
  11.     }
  12.     public static function getSubscribedEvents(): array
  13.     {
  14.         return [
  15.             KernelEvents::REQUEST => ['setTimeZone'10],
  16.         ];
  17.     }
  18.     public function setTimeZone(RequestEvent $event): void
  19.     {
  20.         $request $event->getRequest();
  21.         try {
  22.             $timezone $this->parameterBag->get('default_timezone');
  23.         } catch (ParameterNotFoundException) {
  24.             $timezone self::DEFAULT_TIMEZONE;
  25.         }
  26.         if (($requestTz $request->headers->get('X-User-Timezone')) !== null) {
  27.             $timezone $this->formatRequestTimezone($requestTz) ?? $timezone;
  28.         }
  29.         if (!\is_string($timezone)) {
  30.             throw new \InvalidArgumentException('Parameter $timezone must be string');
  31.         }
  32.         \date_default_timezone_set($timezone);
  33.     }
  34.     private function formatRequestTimezone(string $timezone): ?string
  35.     {
  36.         $timezone \trim($timezone);
  37.         if (\in_array($timezone\timezone_identifiers_list(\DateTimeZone::ALL), true)) {
  38.             return $timezone;
  39.         }
  40.         return null;
  41.     }
  42. }