grabbee
@grabbee

Как добавить поле в entity Doctrine во время сериализации?

Использую распространенный бандл FosRestBundle для api сайта. Он по умолчанию использует JMS Serializer. Нужно добавить вычисляемое поле в entity Doctrine которая отдается через api. Это URI картинки на сервере. В базе адреса картинок не хранятся, а генерируются динамически отдельным Сервисом.

Раньше я писал Listener, в нем подключал Сервис и дополнял вывод сущности нужной информацией

$visitor = $event->getVisitor();
    $visitor->addData('image_thumb', $thumbUrl);


Теперь они всё поломали, и этот способ не работает. Метод addData не существует. Они всё переписали, доки нет, мануалов как переписать тоже не найти. Как быть то?

С большим трудом нашел описание в две строчки, но без объяснения того, что происходит.
Как вообще решается такая задача в этом случае?
Где почитать про изменения JMS Serializer / FosRestBundle

gistcomment

https://gist.github.com/svolobuev/ecd931f27982ef6f...

$visitor->addData('image_thumb', $thumbUrl);
is an old version of JMS, now use
$visitor->visitProperty(new StaticPropertyMetadata('', 'image_thumb', null), $thumbUrl);
  • Вопрос задан
  • 244 просмотра
Решения вопроса 1
Maksclub
@Maksclub
maksfedorov.ru
Removed deprecated method JsonSerializationVisitor::addData, use :visitProperty(new StaticPropertyMetadata('', 'name', null), 'value') instead

Источник: https://github.com/schmittjoh/serializer/blob/mast...

В UPGRADING.md обычно в библиотеках пишут, что поменяли из обратносовместимого...

Для чего сделали: (довольно поверхностно посмотрел код на Гитхабе)
повысили уровень абстракции — использовали полиморфизм, чтобы можно было более гибко работать с сериализацией/десериализацией/группами и прочее для работы со свойством сущности, для управления условиями добавления этого поля и т.д. возложив ответственность на объект MetaData (на языке паттернов: Стратегия)

Дискусия появления решения: https://github.com/schmittjoh/serializer/pull/45
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы