Сериализатор JMS: как распространить групповое исключение для свойств, не добавляя везде аннотации?

Я создаю 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? Спасибо.


person moudug    schedule 19.07.2018    source источник


Ответы (1)


Через 24 часа я понял, что неправильно использовал концепцию групп исключений для сериализатора jms.

  • Раньше: у меня было 2 группы: "API" и "ADMIN". В этой организации мне нужно было объявить каждое свойство в группах, и это по всему моему дереву зависимостей (например, для белого списка).
  • Now: I only have one group "ADMIN". With this organisation, I need:
    • to declare in the group "ADMIN", only the properties that are not publicly visible
    • объявить мои контроллеры для группы «По умолчанию» для общедоступных запросов и для групп «АДМИН» и «По умолчанию» для запросов, предназначенных только для администратора. Мне не нужно распространять какие-либо группы исключений по дереву зависимостей.

Это прекрасно решает мою проблему. Но, возможно, мое первоначальное требование все еще законно.

person moudug    schedule 20.07.2018