2016-12-02 4 views
0

JMSSerializerでアノテーショングループを検討することは、その仕事をしてDoctrineのオブジェクトコンストラクタが付属していますが、主キーを形成する2つのプロパティを持つエンティティを想像:どのよう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は考慮する必要はありません。あなたは、本体に2つのプロパティを渡す場合

残念ながら、2つの値に応じて、何かが直列化復元によって除外されている場合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にフォールバックすることができません...非常に高速!私の団体UserUserBaseであり、私のすべての識別子はどこにあるのかわからないので、アカウント階層を考慮する必要があります。

ヒント?

答えて

0

いいえ、JMSSerializerのObjectコンストラクタは、識別子の決定時にシリアル化グループを考慮しません。したがって、オブジェクトにすべてのIDを含めると、それらが実際のコンテキストグループの一部であるかどうかに関係なくカウントされます。

この不具合を修正するためにオブジェクトのalternative versionを作成しました私のために)。希望があれば