gpt4 book ai didi

symfony - 如何从@Groups 包含策略 JMS Serializer 反序列化实体更新 symfony/doctrine 实体

转载 作者:行者123 更新时间:2023-12-04 01:40:01 24 4
gpt4 key购买 nike

我正在尝试使用带有 @ExclusionPolicy:None @Groups 包含策略的 JMSSerializer 更新 symfony2/doctrine 实体。

 * @Serializer\ExclusionPolicy("none")
*/
class Foo
{
/**
* @Serializer\Groups({"flag","edit"})
*/
protected $id;

/**
* @Serializer\Groups({"edit"})
*/
protected $name;

/**
* @Serializer\Groups({"flag"})
*/
protected $flag;

/**
* @Serializer\Exclude()
*/
protected $createdBy;
}

引用: http://jmsyst.com/libs/serializer/master/reference/annotations

以下记录的结果:
Foo (id:1, name:'bar', flagged:false ,created_by:123)

使用 Group 包含序列化以避免序列化我不需要的信息(关联、blob 等),因此当我想更新实体时,我只反序列化来自 JSON 的实体的更新字段。
$foo->setFlagged(true);
$data = $serializer->serialize($foo, 'json', SerializationContext::create()->setGroups(array("flag")));

result:
{id:1,flagged:true}

当传递回应用程序时,它会反序列化为实体
$foo = $serializer->deserialize($jsonFoo,'Foo','json');

result:
Foo (id:1, name:null, flagged:true, created_by:null)

问题是当我尝试将实体合并回条令实体管理器时:
$foo = $em->merge($foo);
$em->persist($foo);
$em->flush();

结果 foo 试图用 null 更新排除的属性 (name,created_by)。

我如何告诉 JMSSerializer 或 Doctrine Entity Managers 合并我不想用 null 覆盖现有属性?

最佳答案

我找到了答案。
$serializer是由 symfony2 集成包创建的服务 JMSSerializerBundle .

默认服务是 jms_serializer.serializer初始化 JMSSerializer使用默认的对象构造函数 UnserializeObjectConstructor对于教义,我需要使用 DoctrineObjectConstructor 反序列化.

因为我只用 JMSSerializer在用于序列化/反序列化教义实体的项目中,我覆盖了 JMSSerializerBundlejms_serializer.object_constructor使用适当的对象构造函数服务的别名。

<service id="jms_serializer.object_constructor" alias="jms_serializer.doctrine_object_constructor" public="false"/>

有没有更好的方法来配置序列化程序使用的对象构造函数?

我还添加了适当的上下文来反序列化:
$serializer->deserialize($jsonFoo,'Foo','json', DeserializationContext::create()->setGroups(array('flag')));

result:
Foo (id:1, name:'bar', flagged:true ,created_by:123)

使用学说对象构造函数,它发现我想找到该对象并且只对 $jsonFoo 中提供的字段应用更新。 (和标志组)。这完全消除了对实体管理器合并的需要,我可以正确地保留对象。
$em->persist($foo);
$em->flush();

关于symfony - 如何从@Groups 包含策略 JMS Serializer 反序列化实体更新 symfony/doctrine 实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16525849/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com