Symfony Serializer десериализует XML в объект с детьми - PullRequest
0 голосов
/ 08 мая 2019

У меня есть следующий XML:

<CinemaListExport>
    <Cinema>
        ....
        <screens>
            <screen></screen>
            <screen></screen>
        </screens>
    </Cinema>
    <Cinema>
    ....
    </Cinema>
<CinemaListExport>

Я пытаюсь преобразовать это в следующие объекты:

class CinemaList
{
    /**
     * @var Cinema[]
     */
    public $cinema;

    public function __construct()
    {
        $this->cinema = new ArrayCollection();
    }

    public function addCinema(Cinema $cinema)
    {
        $this->cinema[] = $cinema;
    }
class Cinema
{
    fields...

    /**
     * @var Screen[]
     */
    public $screens = [];

со следующим кодом:

        $normalizers = [
            new ArrayDenormalizer(),
            new ObjectNormalizer(null, null, null, new ReflectionExtractor())
        ];
        $encoders = [new XmlEncoder()];

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


        $res = $serializer->deserialize($xml, CinemaList::class, 'xml');

Независимо от того, что я делаю, я всегда получаю следующее:

class CinemaList#265 (1) {
  public $cinema =>
  class Doctrine\Common\Collections\ArrayCollection#317 (1) {
    private $elements =>
    array(0) {
    }
  }
}

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

1 Ответ

1 голос
/ 08 мая 2019

Что ж, мне пришлось разработать ваше решение и провести некоторый поиск, чтобы понять, почему этот простой вариант использования не работает.

Сначала вы пропустили нормализатор ArrayDenormalizer Требуется десериализация ваших коллекций кино и экрана.:

use Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor;
use Symfony\Component\Serializer\Encoder\XmlEncoder;
use Symfony\Component\Serializer\Normalizer\ArrayDenormalizer;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Serializer;

$objectNormalizer = new ObjectNormalizer(null, null, null, new ReflectionExtractor());

$serializer = new Serializer(
    [new ArrayDenormalizer(), $objectNormalizer], [new XmlEncoder()]
);

Без этого нормализатор массив и коллекция просто пропускаются.

Существует еще одна вещь, связанная с сериализацией / десериализацией, в частности с ObjectNormalizer, в котором используется компонент PropertyAccess.

Вы должны реализовать оба метода adder и remover, если хотите, чтобы он работал.

Многое происходит в методах PropertyAccessor :: writeProperty.Я не буду объяснять весь механизм, но вкратце: если у вас есть методы addXXX и removeXXX, то addXXX будет использоваться в приоритете.Береги себя !если у вас есть только метод addXXX, то он не будет использоваться ... Я не знаю, почему они это сделали, но, безусловно, есть веская причина.Вторым вариантом является сеттер.Если он существует (а у вас нет removeXXX или addXXX), он будет использоваться для добавления элементов из коллекций.

из здесь

Я провел несколько успешных тестов в новом проекте Symfony.Если вы все еще сталкиваетесь с проблемами, я буду рад помочь вам.

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