Как я могу использовать фильтры API Platform в YAML? - PullRequest
0 голосов
/ 27 июня 2019

Прежде всего, я хочу сообщить вам, что я уже прочитал документы о проблеме, с которой я сталкиваюсь сегодня, и я также выполнил поиск в StackOverflow и Google, но не нашел правильного решения.

Я создаю API управления взаимоотношениями с клиентами для практики с Symfony 4 и платформой API. Я уже многое узнал об API Platform, и хотя я мог бы использовать аннотации для конфигурации ресурсов, я заставил себя использовать YAML, чтобы узнать больше об этом.

Итак, у меня есть ресурс Customer, который имеет несколько атрибутов: id , имя , фамилия , адрес электронной почты , Компания , создана на , обновлена ​​на и владелец . Моя цель - добавить SearchFilter на этот ресурс (в YAML) и добавить большинство атрибутов в качестве свойств этого фильтра.

Я уже попробовал решение, приведенное здесь: https://github.com/api-platform/core/issues/1755. Проблема в том, что мне не удается заставить его работать. В services.yaml я вижу, что вы можете добавлять аргументы, но я не знаю, какой эквивалент вы можете найти в аннотациях ...

В config/services.yaml:

# filters
    app.my_filter:
        parent: 'api_platform.doctrine.orm.search_filter'
        tags: ['api_platform.filter']
        autowire: false
        autoconfigure: false
        public: false

В resources/customer.yaml:

App\Entity\Customer:
    collectionOperations:
        get:
            normalization_context:
                groups: ['Customer:Get']
            filters: ['app.my_filter']

То, что я собираюсь сделать, похоже на аннотации в src/Entity/Customer.php:

/**
 * @ApiResource
 *
 * [...]
 *
 * @ApiFilter(SearchFilter::class, properties={
 *     "firstname": "partial",
 *     "lastname": "partial",
 *     "emailAddress": "partial",
 *     "company": "partial"
 * })
 */
class Customer
{
...
}

Я надеюсь, что вы сможете помочь и что моя проблема четко объяснена. Если нет, пожалуйста, скажите мне, и я сделаю все возможное, чтобы дать вам более подробную информацию.

Спасибо!

1 Ответ

1 голос
/ 28 июня 2019

Я нашел решение своей проблемы.Похоже, документы API Platform были не слишком далеки от ответа!Попробовав некоторое время в файле конфигурации ресурса, я наконец решил дать шанс файлу services.yaml.Мне очень помогли в этом выпуске github .Итак, вот что я сделал.

Шаг 1 - В services.yaml:

# filters
    app.customer_resource.search_filter:
        parent:        'api_platform.doctrine.orm.search_filter'
        arguments:     [ { 'firstname': 'partial', 'lastname': 'partial', 'emailAddress': 'partial', 'owner.emailAddress': 'exact' } ]
        tags:          [ { name: 'api_platform.filter', id: 'customer.search_filter' } ]
        autowire:      false # required, explained below
        autoconfigure: false # required, explained below

Примечание 0: аргументы autowire и autoconfigure необходимы здесьв противном случае вы получите сообщение об ошибке:

Атрибут «autowire» / «autoconfigure» для службы «app.customer_resource.search_filter» не может быть унаследован от «_defaults», когда установлен «parent».Переместите ваши дочерние определения в отдельный файл или определите этот атрибут явно в [...] (который загружен в ресурс "[...]").

Примечание 1: Я заметил, что самым важным элементом здесь является "id" элемент аргумента "tags" .Пока я искал решение, я обнаружил vendor/api-platform/core/src/Swagger/Serializer/DocumentationNormalizer::getFilter(), что указывает на то, что вы должны указать идентификатор фильтра, чтобы он работал.Убедитесь сами в шаге 2.

Шаг 2 - В вашем конфигурационном файле ресурсов (мой находится в config/resources/customer.yaml)

App\Entity\Customer:
    collectionOperations:
        get:
            filters: ['customer.search_filter']

    # ...

Я только что добавил фильтр дляоперация сбора GET с использованием (как я уже сказал) важный идентификатор фильтра.Итак, это исправляет мою проблему. НО если у кого-то есть лучшее / более простое решение, я был бы рад узнать его.

Снимок экрана: как выглядит API, когда SearchFilter установлен

...