symfony - JMS 序列化器通过继承反序列化学说实体

标签 symfony doctrine-orm jmsserializerbundle

我有一个使用继承的学说实体:

/**
 * @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>")
 */

我只添加 Text 元素,它可以正常工作,但添加其他元素(当然)会中断。

最佳答案

查看BaseSerializationTest和夹具Vehicle ... @Discriminator 应该完全符合您想要实现的目标。

您反序列化对象的方式一定有问题。正确应用了映射吗?否Exlusion StrategyGroups涉及?

关于symfony - JMS 序列化器通过继承反序列化学说实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17551959/

相关文章:

web-services - Symfony2 网站和 RESTful API

symfony - 如何实现 FosOAuthServerBundle 以保护 REST API?

zend-framework - 如何使用Zend Framework使用Error 500测试错误页面

json - Doctrine2、PersistentCollection 和 JMS 序列化器

php - Symfony 不会从集合中删除实体

serialization - JMSSerializerBundle。无法控制第三方元数据

symfony - 以随机顺序和限制从数据库中返回随机数据

symfony - 对 Symfony 测试实践的困惑 : functional vs integration testing

symfony - 在 symfony2 中,使用 jmsSerializerBundle 序列化然后反序列化子实体在保存父实体时会抛出异常

symfony hatoas 和 jms 序列化