2012-05-22 25 views
6

Geçerli projem için gereksinimlerimden biri, kullanıcının kendi hesabı için bir saat dilimi seçmesine izin vermek ve bu zaman dilimini tüm tarih/saat ile ilgili tüm özellikler için kullanmaktır. Tüm site. PHP'nin date_default_timezone_set() Symfony2: Kullanıcı tanımlı bir saat dilimi ayarlanacağı yer

kullanarak varsayılan saat dilimini belirleme her yeni DateTime

  • için patlamadı en kurucusuna bir DateTimeZone nesnesinde

    • Geçiş:

      Gördüğüm kadarıyla, ben iki seçeneğiniz vardır Date_default_timezone_set kullanmak için yol kullanmak gibi görünüyor, ama tam olarak nerede ayarlamalı emin değilim. Saat dilimi kullanıcıdan kullanıcıya farklı olacağından ve tüm site üzerinde DateTime kullanıldıklarından, tüm sayfaları etkileyeceği bir yere ayarlamanız gerekir.

      Başarılı bir girişten sonra onu ayarlayan bir olay dinleyicisi yazabilir miyim? Bu yaklaşımı kullanırsam, tüm sayfalarda ayarlanacak mı yoksa yalnızca sayfa başına mı ayarlanacak?

      Diğerlerinin buna nasıl yaklaşacağını öğrenmek isterim.

  • cevap

    14

    Yea, kernel.request etkinliğinde hooking yapan bir olay dinleyicisi kullanabilirsiniz. İşte

    Projelerim birinden dinleyicidir:

    <?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()}'"); 
        } 
    } 
    
    +3

    @elnur, benim sunucu "UTC" ve kullanıcı için "Amerika/Caracas" olarak ayarlandığını varsayalım. Çözümünüzle, bir kullanıcı bazı varlık alanında bir tarih bilgisini gönderdiğinde ne olur? Tarihsa, kullanıcı saat dilimi ile (kullanıcının girdiği değere göre hiçbir değişiklik olmadan) veya sunucu saat dilimi ile (değer UTC saatiyle eşleşecek şekilde değiştirilir) kaydedilecek mi? –

    +0

    @David UTC tabanlı zamanları/tarihleri ​​yalnızca veritabanınıza kaydetmelisiniz. Bu şekilde, kullanıcı için her zaman doğru şekilde biçimlendirebilirsiniz. – Luke