3

継承を使用する Doctrine Entity があります。

/**
 * @ORM\Entity
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 * @ORM\DiscriminatorMap({"video" = "Video", "text" = "Text", "image" = "Image" })
 * @ORM\Table(name="item_block_content")
 * @ORM\HasLifecycleCallbacks
 *
 * @Serializer\Discriminator(field = "discr", map = {
 *    "text": "Namespace\To\Entity\Text",
 *    "video": "Namespace\To\Entity\Video",
 *    "image": "Namespace\To\Entity\Image"
 * })
 */
class Content implements interfaces\Response {
...
}

また、コンテンツ エンティティのコレクションを含むアイテム エンティティもあります。JMSSerializer を使用してこれらのエンティティを XML にシリアル化すると、discr 列が表示されます。

<id />
<metadata />
<metadata_technical />
<created>2013-07-01T11:59:50+02:00</created>
<modified>2013-07-01T12:35:51+02:00</modified>
<title>Some title</title>
<text>Some text</text>
<discr>text</discr>

XML を逆シリアル化したい場合、コンテンツ クラスを除いて、期待どおりの結果が得られます。それらはすべて \Namespace\To\Entity\Content オブジェクトです。この方法では、変更をデータベースに保存できません。

上記のコード例では、@Discriminatorアノテーションを使用してエンティティ タイプを指定しようとしましたが、うまくいきません。どうすればこれを機能させることができますか?私は近いと思いますが、アイデアがありません。

編集

親クラスに次の変更を加えた場合:

/**
 * @ORM\OneToMany(targetEntity="Namespace\To\Entity\Content", mappedBy="Block", cascade={"persist"})
 *
 * @Type("ArrayCollection<Namespace\To\Entity\Content>")
 */

/**
 * @ORM\OneToMany(targetEntity="Namespace\To\Entity\Content", mappedBy="Block", cascade={"persist"})
 *
 * @Type("ArrayCollection<Namespace\To\Entity\Text>")
 */

そして、適切に機能するテキスト要素のみを追加しますが、他の要素を追加すると(もちろん)壊れます。

4

1 に答える 1