Фильтры псевдонимов платформы Api для вложенных ресурсов

#symfony #api-platform.com

#symfony #api-platform.com

Вопрос:

В настоящее время я использую платформу API и ее поисковый фильтр по умолчанию, и он работает так, как задумано.
Однако фильтрация глубоких взаимосвязей между ресурсами может быть сложной из-за довольно длинной строки запроса в URL. (У меня есть несколько подобных объектов.)

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

 {url}/books?department.store.city.country.name=italy
 

Есть ли какой-либо способ отредактировать @ApiFilter(SearchFilter::class, properties={}), чтобы получить просто в конце?

 {url}/books?country_filter=italy
 

Спасибо!

Ответ №1:

Спасибо за ваши советы,

После некоторых (часов) исследований я пришел к выводу о необходимости расширения SearchFilter при создании моего личного CountryFilter :

В моем классе сущностей :

 /*
 * @ApiFilter(CountryFilter::class, properties={
 *   "country_filter": "department.store.city.country.name",
 * })
 */
 

В моем AppFilterCountryFilter.php :

 <?php

namespace AppFilter;

use ApiPlatformCoreBridgeDoctrineOrmFilterSearchFilter;
use ApiPlatformCoreBridgeDoctrineOrmFilterAbstractContextAwareFilter;
use ApiPlatformCoreBridgeDoctrineOrmUtilQueryNameGeneratorInterface;
use DoctrineORMQueryBuilder;

final class CountryFilter extends SearchFilter
{
    protected function filterProperty(string $property, $value, QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, string $operationName = null)
    {
        foreach($this->properties as $alias => $propertyName){
            if($alias == $property){
                $property = $propertyName;
                break;
            }
        }

        /*
        if (
            null === $value ||
            !$this->isPropertyEnabled($property, $resourceClass) ||
            !$this->isPropertyMapped($property, $resourceClass, true)
        ) {
            return;
        }
        */

        // The rest of the SearchFilter.php copy/pasted code ...
    }

    public function getDescription(string $resourceClass): array
    {
        // ....
    }
}
 

Ответ №2:

Вы можете создать свой собственный фильтр api и добавить в него свою собственную логику.Назовите его country_filter и передайте только одно значение, после чего пользовательский запрос выполнит поиск в базе данных и вернет строки. Чтобы создать его, вам нужно расширить класс AbstractFilter, и после этого вы должны добавить этот фильтр в свою сущность. Хороший учебник с официального сайта находится здесь, а следующая глава здесь