#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, и после этого вы должны добавить этот фильтр в свою сущность. Хороший учебник с официального сайта находится здесь, а следующая глава здесь