我正在尝试使用JMSSerializerBundle将JSON用于Doctrine实体。我需要创建数据库中尚不存在的新实体,并在现有实体已存在时更新它们。我正在使用JMSSerializer包中包含的DoctrineObjectConstructor来帮助解决这个问题。当我使用包含指定为标识符的属性的JSON时,例如:
{ "id": 1, "some_other_attribute": "stuff" }
通过尝试反序列化它,JMSSerializer会导致警告并最终因为尝试利用反射来设置空值的属性而死亡。警告都是这样的:
PHP Warning: ReflectionProperty::setValue() expects parameter 1 to be object, null given in /Users/cdonadeo/Repos/Ubertester/vendor/jms/serializer/src/JMS/Serializer/GenericDeserializationVisitor.php on line 176
如果我在我的数据库中手动插入ID为1的实体并再次尝试,那么我没有收到任何错误,所有内容似乎都正常工作,但我现在已经缩短了我的一半功能。我查看了DoctrineObjectConstructor类的代码,顶部是注释:
/** * Doctrine object constructor for new (or existing) objects during deserialization. */
但我不知道它是如何创建一个新的实体的,因为在construct()
函数完成所有检查之后,它最后会调用:
$object = $objectManager->find($metadata->name, $identifierList);
由于数据库中不存在标识符,因此结果为null,这最终是从函数返回的内容。这解释了为什么在数据库中使用适当的ID插入行会使事情正常工作:find()
现在返回一个正确的Entity对象,这是库的其余部分所期望的。
我使用的库错了还是坏了?我把Git仓库和made an edit分开了,尝试一切看起来或多或少都像我预期的那样。那个编辑确实有一些缺点,让我想知道我是不是只是让它比它更难。我看到的最大问题是它会导致持久化和未经存在的实体混合在一起而无法分辨哪些是哪个,但我不知道这是否是一个大问题。
答案 0 :(得分:0)
对于Doctrine实体,请使用配置:
jms_serializer:
object_constructors:
doctrine:
fallback_strategy: "fallback" # possible values ("null" | "exception" | "fallback")
请参阅配置参考https://jmsyst.com/bundles/JMSSerializerBundle/master/configuration