symfony - JMS Serializer:如何在不到处添加注释的情况下传播属性的组排除?
问题描述
我正在使用 Symfony 和 JMS Serializer(通过 FOSRestundle)构建一个公开树的 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
为所有属性添加注释,并将其传播到属性的类中,并沿着 dependencies 向下传播。
我不想复制@Serializer\Groups
所有实体类中的注释。所以我尝试了 JMS 排除策略 ( @Serializer\ExclusionPolicy()
),但这似乎不起作用。
有没有办法无条件地公开/排除当前 JMS 排除组的类?谢谢。
解决方案
24 小时后,我意识到我误用了 jms 序列化程序的排除组的概念。
- 之前:我有 2 个组:“API”和“ADMIN”。有了这个组织,我需要声明组中的每个属性,而这一直在我的依赖树中(就像白名单一样)。
- 现在:我只有一组“管理员”。有了这个组织,我需要:
- 在组“ADMIN”中声明,只有不公开可见的属性
- 为公共请求的组“默认”声明我的控制器,为仅限管理员的请求声明组“管理员”和“默认值”。我不需要沿着依赖树传播任何排除组。
这很好地解决了我的问题。但也许我最初的要求仍然是合法的。
推荐阅读
- flutter - Flutter 从父小部件继承所有道具
- php - WP-JSON - 多端点 - 再次发生 Foreach 错误
- movesense - Movesense 加速度计和陀螺仪刻度
- safari-app-extension - 如何在 Safari App Extension 中识别选项卡(或获取其 ID)?
- api - 如何通过 API 邀请现有的 GAds 帐户加入我的 MCK?
- azure - 使用 Azure 自动化流程 SSAS 表格模型
- node.js - 面临护照js的问题
- reactjs - 是否有任何组件在 ReactJs 中呈现列表等同于 react native 中的 FlatList?
- php - 如何将内联 HTML 定向到变量?
- apache - 如何解决此 https 问题?