2016-12-02 56 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以修復此不良行爲(至少爲了我)。希望它可以幫助