Symfony + JMS Serializer:如何设置默认时区?

时间:2015-11-27 08:35:37

标签: php symfony datetime timezone

我正在开发一个Symfony webapp项目,并且遇到了JMS Serializer使用的时区问题。

简短版:

如何设置在我的symfony项目中使用的全局默认时区,无论项目是在浏览器中使用还是在命令行中使用?

(非常)长版:

  • 在全局服务器php.ini 时区设置为date.timezone = "America/Chicago"
  • 然而,webapp应使用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 Serializer缓存了时区:

$ 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(de)序列化对象时,都会将错误的时区应用于所有日期。当应用程序运行浏览器时(使用具有更改的默认时区的FrontControllers),情况就是如此。

当然,所有其他控制台命令的问题都是相同的,因为它们都使用全局的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),这可能会很麻烦。
  • 如果没有任何可能无法通过FrontControllers路由的内部php调用,我仍然不能100%确定,因此可能会使用错误的时区:

结论:

是否有任何选项可以为整个Symfony项目全局设置默认时区?到目前为止,我只找到option that was used in Symfony 1.x,但没有找到Symfony 2.x的等效解决方案

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

嗯,有时答案很明显,人们看不到它。至少在此之前没有写一个长问题......: - )

在我发送问题后,我找到了答案:默认时区应该全局应用于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);
    }
}