2016-04-11 12 views
6

Nella mia app Symfony 3, sto usando un normalizzatore e un serializzatore per formattare un set di risultati come JSON. Per default tutti i datetimes dottrina sono resi nel formato:symfony 3 normalizer per json - format all Timestamps

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

posso uscita questo in un formato di data ISO su una base per-settore fissando una richiamata sul normalizzatore come segue:

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

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

Ma mi piacerebbe applicare questa modifica a tutti gli Timestamp senza dover specificare ogni campo. C'è un modo semplice per fare questo?

Entity definizione:

/** 
* @var \DateTime 
* 
* @ORM\Column(name="MAINTENANCE_START", type="datetime", nullable=true) 
*/ 
private $maintenanceStart; 

Controller cod:

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

risposta

7

Nel tentativo di seguire il metodo prescritto (postato qui https://stackoverflow.com/a/33149890/403614), ho trascurato di osservare che la matrice di normalizzatori passato nella Serializzatore è ordine-dipendente.

Quindi, il problema e risolverlo per il mio codice di cui sopra è quello di invertire l'ordine in modo che il DateTime Normalizer applica prima:

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

È possibile creare il proprio normalizzatore, e dichiararla come un servizio.

È possibile utilizzare il codice esatto della risposta: https://stackoverflow.com/a/33149890/403614

+0

ho provato, ma sulla linea che mette alla prova '$ dati instanceof \ DateTime' , restituisce sempre false. Il mio valore di data appare come una matrice di 4 valori; 'country_code',' latitude', 'longitude' e' comments' – Black

+0

Hai provato a cambiare la priorità? '- {name: serializer.normalizer, priority: 10}' – magnetik

+0

@Francis Perché stai usando 4 parametri per cambiare il fuso orario, puoi semplicemente usare le abbreviazioni del fuso orario (un parametro). Quando si inserisce nel DB, lo si converte nel fuso orario del server. Quando lo visualizzi all'utente, puoi semplicemente modificare il fuso orario globale della sua preferenza. Spero che aiuti. –

Problemi correlati