Правила включения полей в JMS Serializer

Я ищу способ динамического включения полей при выводе данных JSON через сериализатор JMS. И я нашел сообщение здесь: https://jolicode.com/blog/how-to-implement-your-own-fields-inclusion-rules-with-jms-serializer

Решение здесь для включения/исключения текущих полей текущего объекта. Но я также хочу определение полей подсущностей, когда сущность имеет отношения «один ко многим». Например:

class User
{
   private $name;
   private $age;

   /**@Type("array<Book>")**/
   var $books = [];
}

class Book
{
   private $title;
   private $pages;
   private $content;
}

Так что я могу передать массив в FieldsListExclusionStrategy, чтобы понять данные здесь:

$fields = [
  'User' => ['name'],
  'Book' => ['title'],
];

Но не только id и title для текущего объекта. Кто-нибудь знает, как это сделать?


person Yarco    schedule 28.08.2017    source источник


Ответы (1)


Эм... Наконец-то я получил код (похожий на пост):

class FieldsListExclusionStrategy implements \JMS\Serializer\Exclusion\ExclusionStrategyInterface
{
    private $fields = [];

    public function __construct(array $fields = [])
    {
        $this->fields = $fields;
    }

    public function shouldSkipClass(\JMS\Serializer\Metadata\ClassMetadata $metadata, \JMS\Serializer\Context $context)
    {
        return false;
    }

    public function shouldSkipProperty(\JMS\Serializer\Metadata\PropertyMetadata $property, \JMS\Serializer\Context $context)
    {
        $class = $property->class;
        if (!isset($this->fields[$class])) return false;

        $fields = $this->fields[$class];
        $name = $property->serializedName ?: $property->name;
        return !in_array($name, $fields);
    }
}
person Yarco    schedule 28.08.2017