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