Одно из моих требований к моему текущему проекту – позволить пользователю выбрать часовой пояс для своей учетной записи, а затем использовать этот часовой пояс для всех связанных с датой и временем функций на всем сайте.
То, как я это вижу, у меня есть два варианта:
date_default_timezone_set()
Похоже, использование date_default_timezone_set – это путь, но я не уверен, где именно я должен его установить. Поскольку часовой пояс будет отличаться от пользователя к пользователю, а DateTime используются по всему сайту, мне нужно установить его где-нибудь, чтобы он затронул все страницы.
Может быть, я могу написать прослушиватель событий, который устанавливает его после успешного входа в систему? Если я возьму этот подход, он останется установленным на всех страницах или будет установлен только для каждой страницы?
Мне бы хотелось услышать, как к этому подходят другие.
Да, вы можете использовать прослушиватель событий, подключаясь к событию kernel.request
.
Вот слушатель из одного из моих проектов:
<?php namespace Vendor\Bundle\AppBundle\Listener; use Symfony\Component\Security\Core\SecurityContextInterface; use Doctrine\DBAL\Connection; use JMS\DiExtraBundle\Annotation\Service; use JMS\DiExtraBundle\Annotation\Observe; use JMS\DiExtraBundle\Annotation\InjectParams; use JMS\DiExtraBundle\Annotation\Inject; /** * @Service */ class TimezoneListener { /** * @var \Symfony\Component\Security\Core\SecurityContextInterface */ private $securityContext; /** * @var \Doctrine\DBAL\Connection */ private $connection; /** * @InjectParams({ * "securityContext" = @Inject("security.context"), * "connection" = @Inject("database_connection") * }) * * @param \Symfony\Component\Security\Core\SecurityContextInterface $securityContext * @param \Doctrine\DBAL\Connection $connection */ public function __construct(SecurityContextInterface $securityContext, Connection $connection) { $this->securityContext = $securityContext; $this->connection = $connection; } /** * @Observe("kernel.request") */ public function onKernelRequest() { if (!$this->securityContext->isGranted('ROLE_USER')) { return; } $user = $this->securityContext->getToken()->getUser(); if (!$user->getTimezone()) { return; } date_default_timezone_set($user->getTimezone()); $this->connection->query("SET timezone TO '{$user->getTimezone()}'"); } }