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

Я создаю API с Symfony и JMS Serializer (через FOSRestundle), который предоставляет деревья. Я создал объект Tree, который содержит идентификатор, заголовок и корневой узел дерева. Я также создал объект Node, связанный с цепочкой между узлами.

Мой API содержит публичную часть и административную часть, и я хочу, чтобы деревья отображались по-разному в зависимости от того, принадлежит ли контроллер тому или другому:

  • в общедоступном 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? Спасибо.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
0
772
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

  • Раньше: у меня было 2 группы: «API» и «ADMIN». В этой организации мне нужно было объявить каждое свойство в группах, и это по всему моему дереву зависимостей (например, для белого списка).
  • Теперь: у меня только одна группа «АДМИНИСТРАТОР». С этой организацией мне нужно:
    • объявлять в группе «ADMIN» только те свойства, которые не являются общедоступными
    • объявить мои контроллеры для группы «По умолчанию» для общедоступных запросов и для групп «ADMIN» и «По умолчанию» для запросов, предназначенных только для администратора. Мне не нужно распространять какие-либо группы исключений по дереву зависимостей.

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

Другие вопросы по теме