0

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ため、おそらく一般的な方法で階層を考慮する必要があります。

ヒントはありますか?

4

1 に答える 1

0

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

この誤動作を修正するために、オブジェクトの代替バージョンを作成しました(少なくとも私にとっては)。それが役に立てば幸い

于 2016-12-02T17:25:36.947 に答える