Я запускаю Symfony 2.7, и я пытаюсь вывести объект (объект Doctrine) как JSON.Обратный звонок на сериализаторе Symfony
Когда я нормализую объект, я хочу преобразовать некоторые его значения. Чтобы сделать это, я нашел метод setCallbacks в the documentation, но я немного зациклен на том, как применить его к моему делу.
Есть ли способ вызвать метод setCallbacks в нормализаторе, который задается при вызове службы сериализатора Symfonys?
Вот небольшой пример того, что я пытаюсь достичь:
//ExampleController.php
public function getJSONOrderByIdAction($id) {
$serializer = $this->get('serializer');
$normalizer = $serializer->getNormalizer(); // <- This is what I'm unable to do
$dateTimeToString = function ($dateTime) {
return $dateTime instanceof \DateTime ? $dateTime->format(\DateTime::ISO8601) : '';
};
$normalizer->setCallbacks(['time' => $dateTimeToString]);
$order = $this->getDoctrine()->find("AppBundle:Order", $id);
return new JsonResponse(["order" => $serializer->normalize($order, null, ["groups" => ["public"]])]);
}
Я знаю, что большинство людей перешли на сериализатором JMS. Кажется, что встроенный сериализатор должен иметь возможность обрабатывать то, что я пытаюсь достичь.
Я не тестировал код, но должен работать. Попробуйте сами и дайте мне некоторую обратную связь, если это необходимо; Я обновлю ответ для сообщества – giosh94mhz
Похоже, что это может быть путь. Пример DateTime был именно тем, что они использовали в документации Symfonys. Но скажем, что в моем заказе есть набор продуктов, и мне также нужно что-то сделать с этим. Смогу ли я создать ProductNormalizer или мне как-то понадобится обработать коллекцию? Кроме того, я не совсем уверен, как применять новые нормализаторы к сервису Symfony? Я полагаю, что просто создание службы недостаточно, и у сериализатора нет метода «addNormalizer». Прошу прощения, если некоторые из них должны быть заданы. Для меня это совершенно новая территория. – Daniel
@ Daniel. Процесс нормализации по умолчанию лучше всего использовать стандартную реализацию, но по умолчанию часто переводится на уродливый. Метод addNormalizer не существует (по какой-то причине), но для этого используется тег 'serializer.normalizer'. У вас может быть общий класс «MyTweeksToNormalizer», который обрабатывает несколько классов, но это может стать сложным, когда вы идете. В качестве альтернативы вы можете просто реализовать «NormalizableInterface» для всей вашей сущности. В качестве лучшего решения вы можете переключиться на «jms-serializer» и воспользоваться сериализацией, управляемой конфигурацией. – giosh94mhz