簡體   English   中英

Symfony + JMS序列化器:如何設置默認時區?

[英]Symfony + JMS Serializer: How to set default Timezone?

我正在開發一個Symfony webapp項目,並且JMS序列化器使用的時區有問題。

簡潔版本:

如何設置在我的symfony項目中使用的全局默認時區,而不管該項目是在瀏覽器中還是在命令行中使用?

(非常)長版:

  • 在全局服務器php.ini中,時區設置為date.timezone = "America/Chicago"
  • 但是,Web應用程序應使用UTC作為默認時區。

為此,我只添加了ini_set("date.timezone", "UTC"); app.phpapp_dev.php FrontControllers。 由於對應用程序的每次訪問都通過這些文件進行路由,因此該解決方案效果很好。

但是,此解決方案存在一個大問題:僅當通過這些FrontControllers /在瀏覽器中使用該應用程序時,它才有效。

每當我使用控制台或任何其他命令行訪問項目時,都不會使用Frontcontrollers,因此不會應用時區設置。

例如,在清除和預熱緩存時,這是一個問題:

php app/console cache:clear --env=dev

由於php直接在命令行上使用,因此使用全局php.ini 因此,將應用全局date.timezone = "America/Chicago"

似乎默認時區存儲在appDevDebugProjectContainer.xml緩存文件中,此外,該時區也為JMS序列化程序緩存在以下位置:

$ cd ...../app/cache/dev
$ grep -rnw .'/' -e "America/Chicago"
./appDevDebugProjectContainer.xml:4125:      <argument>America/Chicago</argument>
./appDevDebugProjectContainer.php:3083:        return $this->services['jms_serializer.datetime_handler'] = new \JMS\Serializer\Handler\DateHandler('Y-m-d\\TH:i:sO', 'America/Chicago', true);

因此,每次使用JMS對對象進行序列化時,都會將錯誤的時區應用於所有日期。 甚至在應用程序運行瀏覽器(使用具有更改的默認時區的FrontController)時也是如此。

當然,所有其他控制台命令的問題都相同,因為它們都使用全局php.ini。 我該如何解決?

可能的解決方案:

  • 在全局php.ini中更改時區:不可能,因為我沒有對服務器的root訪問權限,並且同一php.ini在不同的域/項目之間共享。 其他域/項目需要America/Chicago作為默認時區
  • 對項目使用本地php.ini:不可能,因為php.ini僅適用於同一文件夾中的php文件。 不可能在每個項目文件夾中創建和維護php.ini。
  • 使用本地php.ini進行命令行php調用 :Frontontrollers仍然會為應用程序的所有“瀏覽器”調用設置時區。 另外,我會為在命令行上使用php時用作參數的項目創建一個 php.ini:

碼:

// in ./.bashrc
alias phpx='php -c /path/to/project/php.ini'

// use phpx instead of php
phpx app/console cache:clear --env=dev

此解決方案可以工作,但我不喜歡它:

  • 我必須維護兩個php.ini文件。 全局php.ini和項目php.ini。 由於不將INI組合在一起(從iniA中選擇一個選項,從iniB中選擇所有其他選項),因此可能會很麻煩。
  • 我仍然不是100%確定是否沒有任何內部php調用可能不會通過FrontControllers路由,因此可能使用錯誤的時區:

結論:

是否有任何選項可以為整個Symfony項目全局設置默認時區? 到目前為止,我只找到了Symfony 1.x中使用選項,但沒有Symfony 2.x的等效解決方案

任何想法?

好吧,有時候答案很明顯,以至於看不到它。 至少在這里寫一個長問題之前不是... :-)

在我發送問題之后,我立即找到了答案:無論使用哪種方式(瀏覽器,控制台等),默認時區都應該在整個Symfony中全局應用。 那么,Symfony的哪一部分在任何時間,任何地方都在使用? 內核!

我只是修改了AppKernel,它可以正常工作:

class AppKernel extends Kernel
{   
    public function __construct($environment, $debug)
    {
        // Two is better than one...
        ini_set("date.timezone", "UTC");
        date_default_timezone_set('UTC');

        parent::__construct($environment, $debug);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM