Php JMS序列化程序-为什么不通过构造函数实例化新对象

Php JMS序列化程序-为什么不通过构造函数实例化新对象,php,symfony,doctrine-orm,jmsserializerbundle,Php,Symfony,Doctrine Orm,Jmsserializerbundle,为什么除了json中的数据外,其他所有值的新实体都实例化为null,为什么实体构造函数没有设置默认值-在构造函数中放置一个die()永远不会执行 更新: 好的,深入代码,当没有找到托管实体时,JMSS将使用条令实例化器类来创建实体——它的唯一任务,在不调用构造函数的情况下创建实体。这有什么原因吗?这是在JMS\Serializer\Construction\UnserializeObjectConstructor 我已经将对象构造函数配置为使用JMS编写的条令对象构造函数,但是使用和不使用它都

为什么除了json中的数据外,其他所有值的新实体都实例化为null,为什么实体构造函数没有设置默认值-在构造函数中放置一个die()永远不会执行

更新: 好的,深入代码,当没有找到托管实体时,JMSS将使用条令实例化器类来创建实体——它的唯一任务,在不调用构造函数的情况下创建实体。这有什么原因吗?这是在
JMS\Serializer\Construction\UnserializeObjectConstructor


我已经将对象构造函数配置为使用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');

问题是默认的ObjectConstructor使用了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\u序列化程序配置中:

jms_serializer:
    object_constructors:
        doctrine:
            fallback_strategy: "fallback"

你能解释一下你是如何将
jms\u serializer.unserialize\u object\u constructor.class
设置为新类的吗?他的意思是将
jms\u serializer.unserialize\u object\u constructor.class
配置选项设置为你自己的
ObjectConstructorInterface
实现的路径,在本例中为
AppBundle\Serializer\ObjectConstructor
。对于序列化程序bundle ^3.0,重写类参数不再适用于我。有效的方法是覆盖
jms\u序列化程序。取消序列化\u对象\u构造函数
服务,将其指向
class:AppBundle\serializer\ObjectConstructor
。对于遇到此问题的人更新:这就足够了
jms\u serializer.unserialize\u对象\u构造函数:类:AppBundle\Serializer\UnserializeObjectConstructor
无需添加别名:
jms\u Serializer.object\u构造函数:别名:jms\u Serializer.doctrine\u object\u构造函数公共:false
,否则您将遇到循环引用