Десериализовать массив сущностей с помощью Symfony Serializer Component и AbstractNormalizer :: OBJECT_TO_POPULATE - PullRequest
0 голосов
/ 04 февраля 2020

Я уже десериализовал в массив объектов с:

$encoders = [new JsonEncoder()];
$normalizers = [new ObjectNormalizer(), new GetSetMethodNormalizer(), new ArrayDenormalizer()];
$serializer = new Serializer($normalizers, $encoders);

$clients = $serializer->deserialize($myJson, 'App\Entity\Client[]', 'json');

И также десериализовал одну сущность в существующую (без INSERT, но UPDATE в дБ):

$clientDb = $clientRepository->find(1);
$client = $serializer->deserialize($myJson, Client::class, 'json', [AbstractNormalizer::OBJECT_TO_POPULATE => $clientDb ]);

Но когда я хочу сделать оба, doctrine только вставить в БД:

$clients = $serializer->deserialize($myJson, 'App\Entity\Client[]', 'json', [AbstractNormalizer::OBJECT_TO_POPULATE => $clientRepository->findAll()]);

Я что-то пропустил?

- Официальный do c, который я нашел, не упомянул об этом: https://symfony.com/doc/current/components/serializer.html#deserializing -in-an-существующий-объект -

РЕДАКТИРОВАТЬ: мне удается сделать это вручную с декодированием json в массив, затем l oop на нем, повторно -кодировать в json каждый элемент в l oop и, наконец, десериализовать их. Но если есть способ сделать это без декодирования / зацикливания / кодирования, я предпочитаю использовать его!

1 Ответ

0 голосов
/ 04 февраля 2020

Проверьте следующую информацию из документации , которую вы упомянули сами:

AbstractNormalizer :: OBJECT_TO_POPULATE используется только для объекта верхнего уровня. Если этот объект является root древовидной структуры, все дочерние элементы, которые существуют в нормализованных данных, будут воссозданы с новыми экземплярами.

Когда для параметра AbstractObjectNormalizer :: DEEP_OBJECT_TO_POPULATE установлено значение true, существующий потомки root OBJECT_TO_POPULATE обновляются из нормализованных данных, а не денормализатора, воссоздающего их. Обратите внимание, что DEEP_OBJECT_TO_POPULATE работает только для одиночных дочерних объектов, но не для массивов объектов. Они все равно будут заменены, когда они присутствуют в нормализованных данных.

Таким образом, из-за этого не поддерживается заполнение массива объектов сразу. Вам придется go через ваш массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...