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




Через 24 часа я понял, что неправильно использовал концепцию групп исключения для сериализатора jms.
Это хорошо решает мою проблему. Но, возможно, мое первоначальное требование все еще законно.