ApiFilter и GroupFilter назначение и использование - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь понять назначение и использование фильтров API, и документация, которую я нахожу в сети, чрезвычайно разрежена, включая "https://api -platform.com / docs / core / filters ".

Насколько я понимаю, фильтры type позволяют пользователю API фильтровать данные в соответствии с заданной стратегией (например, не извлекать данные, когда даты равны нулю), верно?

Написание аннотации фильтра на уровне класса эквивалентно записи его для каждого свойства целевого типа, верно?

Я хотел бы понять фильтр группы, но нет ни одного примератот.Что я должен понять из аннотации класса * @ApiFilter(GroupFilter::class, arguments={"parameterName"="foobargroups"})?foobargroup не используется нигде в кодовой базе.Ни в примере DummyCar.php, ни в другом классе, анг google не находит мне ни одного рабочего примера.

Мне нужен способ заставить API возвращать только часть сущности или другую,Будет ли groupFilter делать?Или это используется только для обработки 1-N отношений?

1 Ответ

0 голосов
/ 29 октября 2018

Это фильтры сериализатора.

, если у вас есть сущность типа

<?php

namespace App\Entity;

use ApiPlatform\Core\Annotation\ApiFilter;
use ApiPlatform\Core\Annotation\ApiProperty;
use ApiPlatform\Core\Annotation\ApiResource;
use ApiPlatform\Core\Serializer\Filter\GroupFilter;
use ApiPlatform\Core\Serializer\Filter\PropertyFilter;
use Symfony\Component\Serializer\Annotation\Groups;

/**
 * @ApiResource
 * @ApiFilter(PropertyFilter::class)
 * @ApiFilter(GroupFilter::class)
 */
class User {
    /**
     *  @Groups({"list"})
     */
    public $email;
    public $firstname;
    public $lastname;
    /**
     *  @Groups({"list"})
     */
    public $age;
}

При отправке запроса GET на /users, например, коллекция в JSON-LD должнавыглядит как

{
    ...
    "hydra:members": [
        {
            "@id": ...,
            "@type": ...,
            "email": "john-email@dre.ss",
            "firstname": "John",
            "lastname": "Doe",
            "age": 30
        },
        {
            "@id": ...,
            "@type": ...,
            "email": "jane-email@dre.ss",
            "firstname": "Jane",
            "lastname": "Doe",
            "age": 20
        }
    ]
    ...
}

При использовании фильтра свойств при отправке запроса GET на /users?properties[]=email&properties[]=firstname коллекция будет выглядеть как

{
    ...
    "hydra:members": [
        {
            "@id": ...,
            "@type": ...,
            "email": "john-email@dre.ss",
            "firstname": "John"
        },
        {
            "@id": ...,
            "@type": ...,
            "email": "jane-email@dre.ss",
            "firstname": "Jane"
        }
    ]
    ...
}

При использовании группового фильтра отправкаGET запрос к /users?groups[]=list, коллекция будет выглядеть так:

{
    ...
    "hydra:members": [
        {
            "@id": ...,
            "@type": ...,
            "email": "john-email@dre.ss",
            "age": 30
        },
        {
            "@id": ...,
            "@type": ...,
            "email": "jane-email@dre.ss",
            "age": 20
        }
    ]
    ...
}

Надеюсь, это поможет понять.

Запись аннотации фильтра на уровне класса эквивалентназаписать его на каждое свойство целевого типа, верно?

Это верно для фильтра ORM, а не для фильтра сериализатора

Наконец, использование @ApiFilter(GroupFilter::class, arguments={"parameterName"="foobargroups"}) позволяет изменитьсвойство параметра запроса, если, например, у вас есть «реальное» свойство с именем groups.Тогда вместо отправки GET запроса на /users?groups[]=list вы отправите /users?foobargroups[]=list

...