Php 用于json的symfony 3规范化器-格式化所有时间戳

Php 用于json的symfony 3规范化器-格式化所有时间戳,php,json,symfony,Php,Json,Symfony,在我的symfony3应用程序中,我使用规范化程序和序列化程序将结果集格式化为JSON。默认情况下,所有日期时间都以以下格式呈现: "maintenanceStart":{ "timezone":{"name":"Australia\/Melbourne", "location":{"country_code":"AU","latitude":-37.81667,"longitude":144.96666, "comments":"Victoria"}}, "offset":36000,

在我的symfony3应用程序中,我使用规范化程序和序列化程序将结果集格式化为JSON。默认情况下,所有日期时间都以以下格式呈现:

"maintenanceStart":{
 "timezone":{"name":"Australia\/Melbourne",
 "location":{"country_code":"AU","latitude":-37.81667,"longitude":144.96666,
 "comments":"Victoria"}},
 "offset":36000,"timestamp":1372892400}
通过在规范化器上设置回调,我可以按每个字段以ISO日期格式输出,如下所示:

    $callback = function ($dateTime) {
        return $dateTime instanceof \DateTime ? $dateTime->format ( \DateTime::ISO8601 ) : '';
    };

    $normalizer->setCallbacks ( array (
            'maintenanceStart' => $callback 
    ) );
但我希望将此更改应用于所有时间戳,而不必指定每个字段。有没有一种简单的方法可以做到这一点

实体定义:

/**
 * @var \DateTime
 *
 * @ORM\Column(name="MAINTENANCE_START", type="datetime", nullable=true)
 */
private $maintenanceStart;
控制器代码:

public function dataAction(Request $request) {

    $doc = $this->get ( 'doctrine' );
    $repo = $doc->getRepository ( 'AppBundle:Customer' );
    $result = $repo->createQueryBuilder ( 'c' )->getQuery ()->getResult ();

    $encoder = new JsonEncoder ();
    $normalizer = new GetSetMethodNormalizer ();

    $callback = function ($dateTime) {
        return $dateTime instanceof \DateTime ? $dateTime->format ( \DateTime::ISO8601 ) : '';
    };

    $normalizer->setCallbacks ( array (
            'maintenanceStart' => $callback 
    ) );

    $serializer = new Serializer ( array (
            $normalizer, new \AppBundle\DateTimeNormalizer() 
    ), array (
            $encoder 
    ) );

    $json = $serializer->serialize ( $result, 'json' );

    return $this->render ( 'default/data.json.twig', [ 
            'data' => $json,
            'base_dir' => realpath ( $this->getParameter ( 'kernel.root_dir' ) . '/..' ) 
    ] );
}

您可以创建自己的规范化器,并将其声明为服务


您可以使用响应的确切代码:

在尝试遵循指定的方法(发布在此处)时,我忽略了观察传递到序列化程序的规范化器数组是顺序相关的

因此,我上面代码的问题和修复方法是颠倒顺序,以便首先应用DateTime规范化器:

$normalizer = new GetSetMethodNormalizer ();
$serializer = new Serializer ( array (
         new \AppBundle\DateTimeNormalizer(), $normalizer
), array (
        $encoder 
) );

我试过了,但是在测试
$data instanceof\DateTime
的行中,它总是返回false。“我的日期”值显示为4个值的数组<代码>国家代码,
纬度
经度
注释
您是否尝试更改优先级
-{name:serializer.normalizer,priority:10}
@Francis为什么要使用4个参数来更改时区,只需使用时区缩写(一个参数)。当您插入数据库时,您可以将其转换为服务器的时区。当您向用户显示它时,您只需更改其首选项的全局时区即可。我希望这能有所帮助。@PixelMaker我从来没有打算用这个数组形式来表示我的日期/时间值。我使用Doctrine从现有的MySql数据库生成模型类,该数据库使用MySql时间戳表示日期,它们以这种数组格式出现在模型类中。。。