2012-05-22 19 views
6

मेरी वर्तमान प्रोजेक्ट के लिए मेरी आवश्यकताओं में से एक है कि उपयोगकर्ता को अपने खाते के लिए समय क्षेत्र चुनने दें और फिर पूरे समय/समय से संबंधित सुविधाओं के लिए इस समय क्षेत्र का उपयोग करें। पूरी साइटSymfony2: उपयोगकर्ता परिभाषित समय क्षेत्र को सेट करने के लिए

  • हर नए दिनांक समय
  • सामान्य समय क्षेत्र सेट करें PHP के date_default_timezone_set()

प्रयोग करने के लिए दिनांक समय के निर्माता के लिए एक DateTimeZone वस्तु में पास:

तरह से मैं इसे देख, मैं दो विकल्प हैं ऐसा लगता है कि date_default_timezone_set का उपयोग करने का तरीका है, लेकिन मुझे यकीन नहीं है कि मुझे इसे कहां सेट करना चाहिए। चूंकि समय क्षेत्र उपयोगकर्ता से उपयोगकर्ता के लिए अलग होगा और साइटटाइम का उपयोग पूरे साइट पर किया जाता है, इसलिए मुझे इसे कहीं भी सेट करना होगा कि यह सभी पृष्ठों को प्रभावित करेगा।

शायद मैं एक ईवेंट श्रोता लिख ​​सकता हूं जो सफल लॉगिन के बाद इसे सेट करता है? यदि मैं यह दृष्टिकोण लेता हूं, तो क्या यह सभी पृष्ठों पर सेट रहेगा या यह केवल प्रति पृष्ठ के आधार पर सेट है?

मुझे यह सुनना अच्छा लगेगा कि दूसरे इस पर कैसे पहुंचेंगे।

उत्तर

14

हाँ, आप एक ईवेंट श्रोता का उपयोग कर सकते हैं, 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()}'"); 
    } 
} 
+3

@elnur, कि अपने सर्वर "यूटीसी" और "अमेरिका/कराकस" उपयोगकर्ता के लिए सेट है लगता है। आपके समाधान के साथ, क्या होता है जब उपयोगकर्ता किसी इकाई क्षेत्र में डेटाटाइम सबमिट करता है? क्या डेटाटाइम उपयोगकर्ता टाइमज़ोन के साथ संग्रहीत किया जाएगा (उपयोगकर्ता द्वारा दर्ज किए गए मान की तुलना में कोई बदलाव नहीं है) या सर्वर टाइमज़ोन (मूल्य यूटीसी समय से मेल खाने के लिए बदला जाता है) के साथ? –

+0

@ डेविड आपको केवल अपने डेटाबेस में यूटीसी आधारित समय/तिथियां स्टोर करनी चाहिए। इस तरह आप हमेशा उपयोगकर्ता के लिए इसे सही ढंग से प्रारूपित कर सकते हैं। – Luke

संबंधित मुद्दे