JMSSerializerBundle具有关系的实体中的序列化组

mrM*_*tir 8 symfony doctrine-orm jmsserializerbundle

我在使用组序列化具有许多关系的实体时遇到问题.我有这样一个序列化相关实体的问题.

假设我有两个实体:产品和相关元素.

/**
 *
 * @Serializer\ExclusionPolicy("none")
 */
class Product {

    /**
     * Primary key
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * 
     * @Serializer\Groups({"list","details"})
     * @Serializer\Type("integer")
     */
    protected $id;

    /**
     * @Serializer\Groups({"list","details"})
     * @Serializer\Type("string")
     */
    protected $name;

    /**
     * @ORM\Column(name="description", type="string", length=4096, nullable=true)
     * 
     * @Serializer\Groups({"details"})
     * @Serializer\Type("string")
     */
    protected $description;

    /**
     * @var ArrayCollection
     * 
     * @ORM\OneToMany(targetEntity="Madden\ProjectBundle\Entity\ProjectResource", mappedBy="project")
     * @Serializer\Groups({"details"})
     * @Serializer\Type("ArrayCollection<Element>")
     */
    protected $details1;

    /**
     * Relation to project tasks
     * @ORM\OneToMany(targetEntity="Madden\ProjectBundle\Entity\ProjectTask", mappedBy="project")
     * @Serializer\Exclude()
     * @Serializer\Type("ArrayCollection<Element>")
     */
    protected $details2;

    ...

}
Run Code Online (Sandbox Code Playgroud)

元素实体具有类似的结构:

/**
 *
 * @Serializer\ExclusionPolicy("none")
 */
class Element {

    /**
     * Primary key
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * 
     * @Serializer\Groups({"list","details"})
     * @Serializer\Type("integer")
     */
    protected $id;

    /**
     * @Serializer\Groups({"list","details"})
     * @Serializer\Type("string")
     */
    protected $name;

    /**
     * @ORM\Column(name="description", type="string", length=4096, nullable=true)
     * 
     * @Serializer\Groups({"details"})
     * @Serializer\Type("string")
     */
    protected $description;

    ...
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,当我使用'详细信息'组实体序列化产品时,我想仅序列化元素的id,但是当你看到实体定义了与Product相同的组时(如果我需要元素对象的详细信息)因为我想要在我的所有实体上都有统一的组,并阻止制作数百个组,如'product_details','element_details'等.

当我访问关系或类似的东西时,有没有办法最终改变序列化组?处理程序可能或类似的东西?

关心并感谢您的帮助

afe*_*ber 7

不幸的是,你不能真正(但继续阅读;-)),至少没有改变序列化器库.罪魁祸首是,在您开始序列化过程的那一刻,组列表被固定在a GroupExclusionStrategy(由其引用Context)中.实际上,代码中存在一个断言,一旦(反)序列化运行,就会阻止修改排除策略.

但实际上,我在我的项目中遇到了完全相同的问题,并且我对序列化程序代码进行了必要的修改.我已经清理了一些代码并将其上传到Github(https://github.com/andreasferber/serializer/tree/recursion-groups).

它添加了新的属性元数据,您可以在下载到子对象时添加,删除或覆盖组.使用注释,它看起来像这样:

/**
 * @Serializer\RecursionGroups(set={"foo", "bar"}, add={"baz"}, remove={"Default"})
 */
private $myProperty;
Run Code Online (Sandbox Code Playgroud)

您也应该能够使用XML或Yaml元数据,但是这是未经测试的,因为我没有使用它们,我还没有添加测试用例.看一下参考文档.由于我还没有进行任何优化,如果您的实体非常庞大并且深度嵌套,则可能会对性能产生显着影响.

如果您觉得这有用,或者您有任何建议,请告诉我,因为如果这不仅是我需要的,我会添加一些测试并尝试将其提交到上游.

  • 您应该考虑向上游提取请求 (2认同)
  • @aferber这看起来很有用.是否有机会获得PR提交以尝试将其变为主人? (2认同)