首页 > 解决方案 > JMS Serializer:如何在不到处添加注释的情况下传播属性的组排除?

问题描述

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

我的 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为所有属性添加注释,并将其传播到属性的类中,并沿着 dependencies 向下传播

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

有没有办法无条件地公开/排除当前 JMS 排除组的类?谢谢。

标签: symfonyjmsserializerbundlejms-serializer

解决方案


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

  • 之前:我有 2 个组:“API”和“ADMIN”。有了这个组织,我需要声明组中的每个属性,而这一直在我的依赖树中(就像白名单一样)。
  • 现在:我只有一组“管理员”。有了这个组织,我需要:
    • 在组“ADMIN”中声明,只有不公开可见的属性
    • 为公共请求的组“默认”声明我的控制器,为仅限管理员的请求声明组“管理员”和“默认值”。我不需要沿着依赖树传播任何排除组。

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


推荐阅读