2

我正在尝试使用 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 存储库并进行了编辑,并尝试了一切似乎或多或少地按我预期的方式工作。该编辑确实有一些缺点,这让我想知道我是否不仅仅是让这变得比它必须的更困难。我看到的最大问题是它会导致持久化和非持久化实体混合在一起,无法分辨哪些是哪些,但我不知道这是否有什么大不了的。

4

1 回答 1

0

对于 Doctrine 实体使用配置:

jms_serializer:
    object_constructors:
        doctrine:
            fallback_strategy: "fallback" # possible values ("null" | "exception" | "fallback")

请参阅配置参考https://jmsyst.com/bundles/JMSSerializerBundle/master/configuration

于 2019-08-04T07:13:48.210 回答