Сериализатор JMS — почему новые объекты не создаются в конструкторе

Почему новые сущности создаются с нулем для всех значений, кроме данных в json, почему конструктор сущностей не устанавливает значения по умолчанию — помещение die () в конструктор никогда не выполняется.

Обновить:

Итак, углубляясь в код, когда не будет найдено ни одного управляемого объекта, JMSS будет использовать класс экземпляра doctrine для создания объекта — его единственного задания — для создания объектов без вызова конструктора. Для этого есть причина? это внутри JMS\Serializer\Construction\UnserializeObjectConstructor


Я настроил конструктор объекта для использования конструктора объекта doctrine, написанного JMS, но одна и та же проблема возникает с этим и без него.

jms_serializer.object_constructor:
alias: jms_serializer.doctrine_object_constructor
public: false

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

В «полях» элемент 0 существует, элемент 1 является новым.

array (size=3)
'id' => int 2
'name' => string 'Categories' (length=10)
'fields' =>
array (size=2)
0 =>
array (size=7)
'id' => int 49
'displayName' => string 'Car Branded' (length=11)
'type' => string 'checkboxlist' (length=12)
'required' => boolean false
'disabled' => boolean false
'name' => string 'h49' (length=3)
1 =>
array (size=3)
'type' => string 'email' (length=5)
'name' => string 'field3491' (length=9)
'displayName' => string 'Email' (length=5)

Сущность выглядит следующим образом после десериализации:

object(stdClass)[2000]
public '__CLASS__' => string 'AppBundle\Entity\FormElement' (length=28)
public 'id' => null
public 'label' => string 'Email' (length=5)
public 'type' => string 'email' (length=5)
public 'defaultValue' => null
public 'required' => null
public 'mappedField' => null
public 'garbageCollection' => null
public 'sortOrder' => null
public 'disabled' => null
public 'uuid' => null
public 'form' => null
public 'multiOptions' => null
public 'filters' => null
public 'submissions' => null

Конструктор сущности:

public function __construct()
{
$this->required = false;
$this->disabled = false;
$this->garbageCollection = false;
$this->sortOrder = 0;
$this->type = 'text';
}

И, наконец, вот как я десериализуюсь:

$serializer = $this->get('jms_serializer');

$entryForm = $serializer->deserialize($json_data, 'AppBundle\Entity\EntryForm', 'json');

6

Решение

Проблема в том, что ObjectConstructor по умолчанию использует Instantiator Doctrine, который не вызывает конструктор класса. Чтобы решить эту проблему, вы можете создать свой собственный ObjectConstructor, который просто возвращает новый экземпляр класса.

Пример:

<?php

namespace AppBundle\Serializer;

use JMS\Serializer\Construction\ObjectConstructorInterface;
use JMS\Serializer\DeserializationContext;
use JMS\Serializer\Metadata\ClassMetadata;
use JMS\Serializer\VisitorInterface;

class ObjectConstructor implements ObjectConstructorInterface
{
/**
* {@inheritdoc}
*/
public function construct(
VisitorInterface $visitor,
ClassMetadata $metadata,
$data,
array $type,
DeserializationContext $context
) {
$className = $metadata->name;

return new $className();
}
}

Если вы используете пакет, просто установите jms_serializer.unserialize_object_constructor.class параметр этого нового класса. В противном случае в вашем конструкторе используйте класс в качестве конструктора объекта.

7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]