在我的Symfony 3应用程序中,我使用规范化程序和序列化程序将结果集格式化为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' ) . '/..' )
] );
}
答案 0 :(得分:8)
在尝试遵循规定的方法(在此发布https://stackoverflow.com/a/33149890/403614)时,我忽略了观察到传入串行器的规范化器数组是依赖于顺序的。
因此,我上面的代码的问题和修复是颠倒顺序,以便首先应用DateTime规范化器:
$normalizer = new GetSetMethodNormalizer ();
$serializer = new Serializer ( array (
new \AppBundle\DateTimeNormalizer(), $normalizer
), array (
$encoder
) );
答案 1 :(得分:2)
您可以创建自己的规范化程序,并将其声明为服务。
您可以使用回复的确切代码:https://stackoverflow.com/a/33149890/403614