Я создаю API с Symfony и JMS Serializer (через FOSRestundle), который предоставляет доступ к деревьям. Я создал объект Tree, который содержит идентификатор, заголовок и корневой узел дерева. Я также создал объект Node, содержащий цепочку между узлами.
Мой API содержит общедоступную часть и административную часть, и я хочу, чтобы деревья отображались по-разному в зависимости от того, принадлежит ли контроллер тому или иному:
- в общедоступном 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? Спасибо.