платформа api, не удается добавить пользовательский фильтр поиска в абстрактный класс с помощью symfony 4

#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.