Как исправить проблему DateTimeNormalizer при использовании Symfony Serializer

#symfony #serialization

#symfony #сериализация

Вопрос:

У меня возникли проблемы с использованием Symfony Serializer для нормализации объектов DateTime в строки.

Я использую следующий код:

 protected function createResponse($data, Int $statusCode){

    $serializedData = $this->serialize($data);

    return new Response($serializedData, $statusCode, array(
        'Content-Type' => 'application/json',
    ));

}

protected function serialize($data, string $format = 'json')
{
    $encoders = [new JsonEncoder()];
    $normalizers = [new ObjectNormalizer(), new DateTimeNormalizer()];

    $serializer = new Serializer($normalizers, $encoders);

    return $serializer->serialize($data, $format);
}
  

Я передаю объекты, которые содержат переменные DateTimeInterface, в метод CreateResponse, определенный выше, но даты не нормализуются до формата RFC3339. Я пропустил важный шаг?

Пример вывода, который я получаю:

 "reportDate":{"timezone":{"name":"UTC","transitions":[{"ts":-9223372036854775808,"time":"-292277022657-01-27T08:29:52 0000","offset":0,"isdst":false,"abbr":"UTC"}],"location":{"country_code":"??","latitude":0,"longitude":0,"comments":""}},"offset":0,"timestamp":1551398400}
  

Комментарии:

1. Вы пытались переместить dateTimeNormalizer перед object normalizer?

2. Я только что попробовал emix, и это работает, большое вам спасибо!

3. Пожалуйста, отметьте мой ответ как решение. Рад, что смог помочь.

Ответ №1:

tl; dr порядок имеет значение.

Попробуйте:

 $normalizers = [new DateTimeNormalizer(), new ObjectNormalizer()];
  

Вместо:

 $normalizers = [new ObjectNormalizer(), new DateTimeNormalizer()];
  

Комментарии:

1. Не могли бы вы объяснить, почему это именно решает проблему? Потому что кажется, что порядок нормализаторов — это то, что, по-видимому, имеет значение, но, похоже, это не задокументировано.