JMSSerializer には Doctrine Object Constructor が付属していますが、主キーを形成する 2 つのプロパティを持つエンティティを想像してみてください。
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
逆シリアル化中に使用することで、1 つのプロパティ キーが除外されます。クライアントは引き続き と の両方email
を送信する可能性がありusername
ます。email
考慮すべきではありませんが。
残念ながら、本体で 2 つのプロパティを渡すと、DoctrineObjectConstructor
逆シリアル化によって何かが除外されているかどうかがチェックされないため、2 つの値に従って、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
ため、おそらく一般的な方法で階層を考慮する必要があります。
ヒントはありますか?