我正在尝试使用带有 @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)
使用组包含进行序列化以避免序列化我不需要的信息(关联、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 覆盖现有属性?