JMS序列化器:如何在不添加注释的情况下传播属性的组排除?

时间:2018-07-19 10:32:43

标签: symfony jmsserializerbundle jms-serializer

我正在使用Symfony和JMS序列化器(通过FOSRestundle)构建一个API,该API公开了树。我创建了一个Tree实体,其中包含ID,标题和树的根节点。我也创建了一个Node实体,其中包含节点之间的链接。

我的API包含一个公共部分和一个管理部分,并且我希望根据控制器是否属于一个或另一个来公开不同的树:

  • 在公共api中,我只希望看到树的ID和标题
  • 在管理api中,我希望树的所有属性都可见,包括根节点。

我来了以下代码:

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation as Serializer;

/**
 * @ORM\Entity(repositoryClass="App\Repository\TreeRepository")
 */
class Tree {

    /**
     * Unique ID to identify the tree
     *
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     * @Serializer\Groups({"ADMIN", "API"})
     */
    private $id;

    /**
     * Name of the tree (example = a failure to diagnose)
     *
     * @ORM\Column(type="string", length=255)
     * @Serializer\Groups({"ADMIN", "API"})
     */
    private $title;

    /**
     * @ORM\OneToOne(targetEntity="App\Entity\Node")
     * @ORM\JoinColumn(referencedColumnName="id")
     *
     * @Serializer\Groups({"ADMIN"})
     */
    private $firstNode;

    public function getId()
    {
        return $this->id;
    }


    public function getTitle(): ?string
    {
        return $this->title;
    }

    public function setTitle(string $title): self
    {
        $this->title = $title;
        return $this;
    }

    public function getFirstNode(): ?Node
    {
        return $this->firstNode;
    }

    public function setFirstNode(?Node $firstNode): self
    {
        $this->firstNode = $firstNode;
        return $this;
    }
}

如您所见,我创建了两个排除组,以便隐藏或公开所需的属性。很好!

但是,要使节点内的属性可见,我必须为所有属性添加@Serializer\Groups批注,并将其传播到所有属性的类中依存关系

我不想在所有实体类中都复制@Serializer\Groups注释。因此,我尝试使用JMS排除策略(@Serializer\ExclusionPolicy()),但这似乎不起作用。

在当前JMS排除组的条件下,是否有办法公开/排除一个类? 谢谢。

1 个答案:

答案 0 :(得分:0)

24小时后,我意识到我为jms序列化程序滥用了排除组的概念。

  • 之前:我有2个组:“ API”和“ ADMIN”。在这个组织中,我需要在依赖项树中声明组中的每个属性,并且要声明此属性(例如白名单)。
  • 现在:我只有一个群组“ ADMIN”。通过这个组织,我需要:
    • 要在“ ADMIN”组中声明仅公开可见的属性
    • 声明公共请求的“默认”组的控制器,以及仅管理员请求的“ ADMIN”和“ Defaults”组的控制器。我不需要在依赖关系树中传播任何排除组。

这很好地解决了我的问题。但是也许我最初的需求仍然合法。