<?php declare(strict_types=1);
namespace App\EventSubscriber;
use Symfony\Component\DependencyInjection\{Exception\ParameterNotFoundException, ParameterBag\ParameterBagInterface};
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\{Event\RequestEvent, KernelEvents};
class TimezoneSubscriber implements EventSubscriberInterface
{
public const DEFAULT_TIMEZONE = 'UTC';
public function __construct(private ParameterBagInterface $parameterBag)
{
}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::REQUEST => ['setTimeZone', 10],
];
}
public function setTimeZone(RequestEvent $event): void
{
$request = $event->getRequest();
try {
$timezone = $this->parameterBag->get('default_timezone');
} catch (ParameterNotFoundException) {
$timezone = self::DEFAULT_TIMEZONE;
}
if (($requestTz = $request->headers->get('X-User-Timezone')) !== null) {
$timezone = $this->formatRequestTimezone($requestTz) ?? $timezone;
}
if (!\is_string($timezone)) {
throw new \InvalidArgumentException('Parameter $timezone must be string');
}
\date_default_timezone_set($timezone);
}
private function formatRequestTimezone(string $timezone): ?string
{
$timezone = \trim($timezone);
if (\in_array($timezone, \timezone_identifiers_list(\DateTimeZone::ALL), true)) {
return $timezone;
}
return null;
}
}