src/EventListener/TimezoneListener.php line 51

Open in your IDE?
  1. <?php
  2. namespace App\EventListener;
  3. use DateTime;
  4. use Doctrine\DBAL\Exception;
  5. use App\Entity\User;
  6. use Symfony\Component\HttpKernel\Event\RequestEvent;
  7. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  8. use Doctrine\DBAL\Types\Type;
  9. use App\DoctrineDBALTypes\UTCDateTimeType;
  10. use Twig\Environment;
  11. use Twig\Extension\CoreExtension;
  12. class TimezoneListener
  13. {
  14.     /**
  15.      * @var TokenStorageInterface
  16.      */
  17.     private $tokenStorage;
  18.     /**
  19.      * @var string
  20.      */
  21.     private $timeZone;
  22.     /**
  23.      * @var Environment
  24.      */
  25.     private $twig;
  26.     /**
  27.      *
  28.      * @param TokenStorageInterface $tokenStorage
  29.      * @param Environment $twig
  30.      * @param string $timeZone
  31.      */
  32.     public function __construct(TokenStorageInterface $tokenStorageEnvironment $twigstring $timeZone 'Europe/Berlin')
  33.     {
  34.         $this->tokenStorage $tokenStorage;
  35.         $this->twig $twig;
  36.         $this->timeZone $timeZone;
  37.     }
  38.     /**
  39.      *
  40.      * @param RequestEvent $event
  41.      * @throws Exception
  42.      */
  43.     public function onKernelRequest(RequestEvent $event): void
  44.     {
  45.         $token $this->tokenStorage->getToken();
  46.         // override doctrine datetime class
  47.         Type::overrideType('datetime'UTCDateTimeType::class);
  48.         Type::overrideType('datetimetz'UTCDateTimeType::class);
  49.         // set time zone
  50.         if (!defined('_USER_TIMEZONE_')) {
  51.             if ($token != null && (($user $token->getUser()) instanceof User) && $user->getTimezone()) {
  52.                 define('_USER_TIMEZONE_'$user->getTimezone());
  53.             } else {
  54.                 define('_USER_TIMEZONE_'$this->timeZone);
  55.             }
  56.         }
  57.         date_default_timezone_set(_USER_TIMEZONE_);
  58.         // get utc time zone offset
  59.         $now = new DateTime();
  60.         $mins $now->getOffset() / 60;
  61.         $sgn = ($mins ? -1);
  62.         $mins abs($mins);
  63.         $hrs floor($mins 60);
  64.         $mins -= $hrs 60;
  65.         $offset sprintf('%+d:%02d'$hrs $sgn$mins);
  66.         $this->twig->addGlobal('TIMEZONE_UTC'$offset);
  67.         $this->twig->getExtension(CoreExtension::class)->setTimezone(_USER_TIMEZONE_);
  68.     }
  69. }