2016-12-02 55 views
0

JMSSerializer自带主义Object构造函数,做自己的工作,但是想象一下,一个实体的两个属性形成一个主键:如何考虑注记组在ObjectConstructor

UserBase 
    prop annotated with @ORM\Id and @Serializer\Groups({"1"}) 
    - username 
    prop annotated with @ORM\Id and @Serializer\Groups({"2"}) 
    - email 

User extends UserBase 
    - other props here, no Id defined. 

一个属性键是使用group=1排除同时反序列化。客户端可能仍会发送emailusername。不应该考虑email

不幸的是,如果你的身体传递两个属性,DoctrineObjectConstructor不检查,如果事情是由反序列化排除在外,所以它会尝试加载从DB实体,根据两个值:

foreach ($classMetadata->getIdentifierFieldNames() as $name) { 
     if (! array_key_exists($name, $data)) { 
      return $this->fallbackConstructor->construct($visitor, $metadata, $data, $type, $context); 
     } 

     $identifierList[$name] = $data[$name]; 
    } 

我想要做的是考虑到我的注释组,以便使用fallbackConstructor以防某些形成标识符的属性丢失。

作为首发,这是一个很好的观点:我创​​建了自己的服务,通过传递annotationDriver。然后,如果形成标识属性与实际组相关联:

$classMetadata = $this->annotationDriver->loadMetadataForClass($metadata->reflection); 
$classMetadata->properties //here groups are listed for each property 

我可以回退到fallbackConstructor,因为如果我没有通过该属性在体内

...不很快!我的实体User扩展了UserBase,我的所有标识符都是这样,所以我应该考虑层次结构,可能是以一种通用的方式。

任何提示?

回答

0

好的,当确定标识符时,JMSSerializer的Object Constructor不考虑序列化组。因此,如果在对象中包含所有ID,无论它们是否为实际上下文组的一部分,它们都将被计入。

我创建了一个对象的alternative version以修复此不良行为(至少为了我)。希望它可以帮助