2016-04-11 50 views
6

在我的Symfony 3應用程序中,我使用規範器和序列化器將結果集格式化爲JSON。默認情況下,所有的學說日期時間呈現的格式:用於json的symfony 3規範器 - 格式化所有時間戳

"maintenanceStart":{ 
"timezone":{"name":"Australia\/Melbourne", 
"location":{"country_code":"AU","latitude":-37.81667,"longitude":144.96666, 
"comments":"Victoria"}}, 
"offset":36000,"timestamp":1372892400} 

我可以輸出這通過在正規化設置的回調在每個字段的基礎上的ISO日期格式如下:

​​

但我想將此更改應用於全部時間戳,而不必指定每個字段。有沒有一個簡單的方法來做到這一點?

實體的定義:

/** 
* @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') . '/..') 
    ]); 
} 

回答

7

在試圖按照規定的方法(在這裏https://stackoverflow.com/a/33149890/403614發佈),我能認識到的是正規化的數組傳遞到串行化是爲了依賴。

所以,這個問題並解決了我上面的代碼被逆轉順序,使日期時間正規化適用第一:

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

您可以創建自己的正規化,並宣佈它作爲一個服務。

您可以使用響應的確切代碼:https://stackoverflow.com/a/33149890/403614

+0

我試過了,但對測試'的instanceof \ DateTime' $數據線,它總是返回false。我的日期值顯示爲4個值的數組; 'country_code','latitude','longitude'和'comments' – Black

+0

您是否嘗試更改優先級? ' - {name:serializer.normalizer,priority:10}' – magnetik

+0

@Francis爲什麼你使用4個參數來改變時區,你可以使用時區縮寫(一個參數)。當你插入數據庫時​​,你將它轉換成服務器的時區。當您將它顯示給用戶時,您可以更改其偏好的全球時區。我希望這有幫助。 –