Symfony — FOSRestBundle — показать выбранные поля

Я пытаюсь показать только выбранные поля в моем действии REST в контроллере. Я нашел одно решение: я могу установить группы в Entities/Models и выбрать эту группу в аннотации выше действия в моем контроллере.

Но на самом деле я не хочу использовать группы, я хочу определить, какие поля я хочу открыть.

Я вижу одно решение - я могу создать одну группу для каждого поля в моих объектах/модели. Как это:

class User
{
    /**
     * @var integer
     *
     * @Groups({"entity_user_id"})
     */
    protected $id;

    /**
     * @var string
     *
     * @Groups({"entity_user_firstName"})
     */
    protected $firstName;

    /**
     * @var string
     *
     * @Groups({"entity_user_lastName"})
     */
    protected $lastName;
}

И тогда я могу перечислить поля над действием контроллера.

Мои вопросы:

  1. Могу ли я использовать лучшее решение для этого?

  2. Могу ли я перечислить все группы? Например, я могу перечислить все маршруты или все услуги.


person Kamil P    schedule 14.10.2015    source источник


Ответы (1)


В основном это касается сериализации, а не самого fosrestbundle.

Правильным способом было бы создать собственную стратегию сериализации полей. В этой статье это действительно хорошо описано:

http://jolicode.com/blog/how-to-implement-your-own-fields-inclusion-rules-with-jms-serializer

Он создает пользовательскую стратегию исключения, как описано здесь:

Как сделать Я создаю настраиваемую стратегию исключения для JMS Serializer, которая позволяет мне во время выполнения принимать решения о включении того или иного поля?

Пример кода из первой ссылки для справки:

пользовательская стратегия FieldExclusion:

namespace Acme\Bundle\ApiBundle\Serializer\Exclusion;

use JMS\Serializer\Exclusion\ExclusionStrategyInterface;
use JMS\Serializer\Metadata\ClassMetadata;
use JMS\Serializer\Metadata\PropertyMetadata;
use JMS\Serializer\Context;

class FieldsListExclusionStrategy implements ExclusionStrategyInterface
{
    private $fields = array();

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

    /**
     * {@inheritDoc}
     */
    public function shouldSkipClass(ClassMetadata $metadata, Context $navigatorContext)
    {
        return false;
    }

    /**
     * {@inheritDoc}
     */
    public function shouldSkipProperty(PropertyMetadata $property, Context $navigatorContext)
    {
        if (empty($this->fields)) {
            return false;
        }

        $name = $property->serializedName ?: $property->name;

        return !in_array($name, $this->fields);
    }
}

Интерфейс

interface ExclusionStrategyInterface
{
    public function shouldSkipClass(ClassMetadata $metadata, Context $context);
    public function shouldSkipProperty(PropertyMetadata $property, Context $context);
}

Применение

в контроллере или где вам это нужно:

$context = new SerializationContext();
$fieldList = ['id', 'title']; // fields to return    
$context->addExclusionStrategy(
    new FieldsListExclusionStrategy($fieldList)
);

// serialization
$serializer->serialize(new Pony(), 'json', $context);

Вы также должны иметь возможность смешивать и сочетать группы, например. вы также можете установить $content->setGroups(['myGroup']) вместе с полемExclusio

person nakashu    schedule 14.10.2015
comment
Хотя теоретически это может ответить на вопрос, было бы предпочтительнее включить сюда основные части ответа и предоставить ссылку для справки . Пожалуйста, отредактируйте свой ответ, чтобы исправить это, затем отметьте свое сообщение, чтобы запросить отмену удаления. - person Matt; 09.11.2015