api 平台,无法使用 symfony 4 将自定义搜索过滤器添加到摘要 class

api platform, can't add a custom search filter to an abstract class using symfony 4

我正在尝试为摘要创建自定义搜索过滤器 class,我希望能够通过一个关键字进行搜索。

搜索过滤代码:

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;
    }

自定义搜索尝试获取资源的新实例 class 但在我的例子中它是一个抽象的 class 并且我得到了关于 :

的错误

无法实例化抽象 class。

在 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;
            }
        }

我需要在不实例化抽象的情况下获取字段 class。

我试图通过调用 :

来删除新资源 class
 $reader = new AnnotationReader();
        $annotation = $reader->getClassAnnotation(new \ReflectionClass(AbstractContact::class), SearchAnnotation::class);

我得到:正在尝试获取 属性 'fields' 的非对象

无需实例化 class,您可以访问 $this->properties

参考:https://api-platform.com/docs/core/filters/#creating-custom-filters