7

現在のプロジェクトの私の要件の 1 つは、ユーザーが自分のアカウントのタイム ゾーンを選択できるようにし、サイト全体ですべての日付/時刻関連機能にこのタイム ゾーンを使用できるようにすることです。

私の見方では、次の 2 つのオプションがあります。

  • 新しい DateTime ごとに DateTimeZone オブジェクトを DateTime のコンストラクターに渡す
  • PHP を使用してデフォルトのタイムゾーンを設定するdate_default_timezone_set()

date_default_timezone_set を使用する方法のようですが、どこに設定すればよいか正確にはわかりません。タイム ゾーンはユーザーごとに異なり、DateTime はサイト全体で使用されるため、すべてのページに影響するようにタイム ゾーンを設定する必要があります。

ログインが成功した後にそれを設定するイベントリスナーを書くことができるでしょうか? このアプローチを採用した場合、すべてのページで設定されたままになりますか、それともページごとにのみ設定されますか?

他の人がこれにどのようにアプローチするかを知りたいです。

4

1 に答える 1

15

ええ、あなたはイベントリスナーを使ってイベントをフックすることができますkernel.request

これが私のプロジェクトの1つからのリスナーです:

<?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()}'");
    }
}
于 2012-05-22T09:35:20.433 に答える