2017-02-20 3 views
1

мне нужна помощь с SF 2.7 сериализаторомSymfony 2,7 ​​DATETIME десериализации

Я сделал API с ПОЛУЧИТЬ Json данных, как это:

{ 
"dateDebut":"2017-02-16", 
"dateFin":"2018-02-16", 
"caMoisTotalHorsSessions":"5.2", 
"caMoisClients":"5.3", 
"caMoisGarantie":"5.4", 
"caMoisHuile":"5.5" } 

Я попробовал много способов, чтобы deserialze в мой объект класса где dateDebut и dateFin посещают быть Datetime объекта, а не строка

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

     $callback = function ($date) { 
      return new \DateTime($date); 
     }; 

     $normalizer->setCallbacks(array(
      'dateDebut' => $callback, 
      'dateFin' => $callback,)); 

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

     $entity = $serializer->deserialize($request->getContent(), $class, $format); 
    } catch (RuntimeException $e) { 
     return new JsonResponse(
      ['code' => Response::HTTP_BAD_REQUEST, 'message' => $this->trans('api.message.data_error')], 
      Response::HTTP_BAD_REQUEST); 
    } 

Но обратные вызовы никогда не используются:/Может ли кто-нибудь мне помочь, пожалуйста?

Цель состоит в том, чтобы автоматически преобразовать строку даты в объект Datetime, прежде чем очистить объект в базе данных.

Большое спасибо

ответ

1

То, что вы пытаетесь сделать, это денормализация. Обратные вызовы нормализатора для нормализация. Я думаю, что это довольно запутанно. Странно, что они предложили бы установить обратный вызов только в одном направлении.

Я проверил код, который делает то, что я думаю, что вы хотите сделать. Вам нужен пользовательский класс нормализатора. Класс не такой сложный, он может простираться от GetSetNormalizer или ObjectNormalizer. Вы просто хотите создать \ DateTime внутри здесь, и вы можете добавить некоторую проверку для даты.

class BoardNormalizer extends GetSetMethodNormalizer 
{ 
    public function denormalize($data, $class, $format = null, array $context = array()) 
    { 
     if (isset($data['created'])) { 
      $data['created'] = new \DateTime($data['created']); 
     } 

     return parent::denormalize($data, $class, $format, $context); 
    } 
} 

Я тестировал его с этим кодом:

$json = json_encode([ 
     'created' => '2017-02-20T05:49:51-0500' 
    ]); 

    $encoder = new JsonEncoder(); 
    $normalizer = new MyCustomNormalizer(); 
    $serializer = new Serializer([$normalizer], [$encoder]); 

    $entity = $serializer->deserialize($json, MyCustomClass::class, 'json'); 

И он произвел свой собственный класс, где created свойство был объект \ DateTime.

+0

Спасибо большое, именно то, что я хотел бы сделать :) –

0

Цель состоит в том, чтобы автоматически преобразовать строку даты в объект Datetime, прежде чем очистить объект в базе данных.

Что-то вроде этого? Использование сеттеров/геттеров? Я использую следующий код в сущности

private $created; 
public function setCreated($created) 
{ 
    if (!($created instanceof \DateTime)) { 
     $created = date_create($created); 
    } 
    $this->created = $created; 

    return $this; 
} 
+0

Не было возможности изменить сущность, потому что использовать Черту, который используется много раз в других субъектов, но благодаря , –

Смежные вопросы