#symfony #filter #api-platform.com
#symfony #Фильтр #api-platform.com
Вопрос:
Я пытаюсь создать пользовательский фильтр поиска для абстрактного класса, я хочу иметь возможность поиска по одному ключевому слову.
Код фильтра поиска :
public function getDescription(string $resourceClass): array
{
$reader = new AnnotationReader();
$annotation = $reader->getClassAnnotation(new ReflectionClass(new $resourceClass), SearchAnnotation::class);
$description['search'] = [
'property' => 'search',
'type' => 'string',
'required' => false,
'swagger' => ['description' => 'FullTextFilter on ' . implode(', ', $annotation->fields)],
];
return $description;
}
Пользовательский поиск пытается получить новый экземпляр класса ресурсов, но в моем случае это абстрактный класс, и я получил сообщение об ошибке :
Не удается создать экземпляр абстрактного класса.
В функции filterProperty мне нужно извлекать поля из аннотации :
$reader = new AnnotationReader();
$annotation = $reader->getClassAnnotation(new ReflectionClass(new $resourceClass), SearchAnnotation::class);
if (!$annotation) {
throw new HttpInvalidParamException('No Search implemented.');
}
$parameterName = $queryNameGenerator->generateParameterName($property);
$search = [];
$mappedJoins = [];
foreach ($annotation->fields as $field)
{
$joins = explode(".", $field);
for ($lastAlias = 'o', $i = 0, $num = count($joins); $i < $num; $i ) {
$currentAlias = $joins[$i];
if ($i === $num - 1) {
$search[] = "{$lastAlias}.{$currentAlias} = :{$parameterName}";
} else {
$join = "{$lastAlias}.{$currentAlias}";
if (false === array_search($join, $mappedJoins)) {
$queryBuilder->leftJoin($join, $currentAlias);
$mappedJoins[] = $join;
}
}
$lastAlias = $currentAlias;
}
}
Мне нужно извлекать поля без создания экземпляра абстрактного класса.
Я попытался удалить новый класс ресурсов, вызвав :
$reader = new AnnotationReader();
$annotation = $reader->getClassAnnotation(new ReflectionClass(AbstractContact::class), SearchAnnotation::class);
Я получил: пытаюсь получить свойство «поля» не-объекта
Ответ №1:
Нет необходимости создавать экземпляр класса, у вас есть доступ к $this-> properties
Ссылка: https://api-platform.com/docs/core/filters/#creating-custom-filters
Комментарии:
1. спасибо за ответ, я отредактировал свой вопрос: как я могу получить поля, если я удалю аннотацию класса reader get? я не могу удалить новый $resourceClass из своего кода
2.В этом случае просто не создавайте экземпляр класса, ReflectionClass принимает строку класса:php.net/manual/en/reflectionclass.construct.php
argument Either a string containing the name of the class to reflect, or an object.
3. еще раз спасибо, я обновил свой вопрос, я вызываю класс reflexion с моим именем абстрактного класса в качестве параметра, я пытался получить свойство «поля» не-объекта
4. Убедитесь
AnnotationReader
, что возвращает объект ( github.com/doctrine/annotations/blob/1.10.x/lib/Doctrine/Common /… ), убедитесь также, чтоSearchAnnotation::class
содержитfields
свойство5. спасибо, я смог создать пользовательский фильтр поиска, используя AbstractFilter платформы api.