XML в / из классов сущностей с использованием Symfony Сериализатор / нормализатор - PullRequest
0 голосов
/ 10 апреля 2020

Я застрял, пытаясь десериализовать XML, используя Serializer Symfony (Symfony 5).

Я поместил минимальную версию проблемы в репозиторий ( https://github.com/tacman/xml-serializer-demo), вот быстрая установка:

git clone https://github.com/tacman/xml-serializer-demo.git bug && cd bug && composer install && bin/console app:demo

Сериализация работает (поэтому конфигурация кажется правильной), но десериализация - нет.

Цель: чтение и запись, вложенные XML с атрибутами

<?xml version="1.0"?>
<product description="Wool sweater">
  <property name="color">blue</property>
  <property name="size">small</property>
</product>

Объекты Product и Properties являются тривиальными и создаются с помощью bin / console make: entity

Сериализатор настроен таким образом, что описание продукта и имя свойства являются атрибутами.

# config/serialization.yaml
App\Entity\Product:
  attributes:
    description:
      serialized_name: '@description'
      groups: ['xml']
    properties:
      serialized_name: 'property'
      groups: ['xml']

App\Entity\Property:
  attributes:
    name:
      serialized_name: '@name'
      groups: ['xml']
    value:
      serialized_name: '#'
      groups: ['xml']

Простой продукт создается и выгружается и отлично работает:

$product = (new Product())
    ->setDescription("Wool sweater");
$product
    ->addProperty((new Property())->setName('color')->setValue('blue'))
    ->addProperty((new Property())->setName('size')->setValue('small'))
    ;

$context = [
    'xml_root_node_name' => 'product',
    'groups' => ['xml'],
    'xml_standalone' => false,
    'xml_format_output' => true,
];
$xml = $this->serializer->serialize($product, 'xml', $context);

Но десериализация не работает.

        /** @var Product $product2 */
        $product2 = $this->serializer->deserialize($xml, Product::class, 'xml');

        dump($product2); // nothing is set :-(

Я пробовал взлом в XMLEncoder и Object Normalizer, но я что-то упустил. Спасибо!

...