Próbuję stworzyć niestandardowy filtr wyszukiwania do abstrakcyjnej klasy, chcę być w stanie wyszukać przez jeden słowo kluczowe.

Kod filtra wyszukiwania:

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

Niestandardowe wyszukiwanie próbuje uzyskać nową instancję klasy zasobów, ale w moim przypadku jest to klasa abstrakcyjna i otrzymałem błąd:

Nie można utworzyć abstrakcyjnej klasy.

W funkcji filtracyjnej muszę pobierać pola z adnotacji:

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

Muszę pobrać pola bez instancji abstrakcyjnej.

Próbowałem usunąć nową klasę zasobów, dzwoniąc:

 $reader = new AnnotationReader();
        $annotation = $reader->getClassAnnotation(new \ReflectionClass(AbstractContact::class), SearchAnnotation::class);

Mam: próbując dostać nieruchomość "pola" nieokranki

0
Khaled Boussoffara 7 październik 2020, 12:26

1 odpowiedź

Najlepsza odpowiedź

Nie ma potrzeby instancji klasy, masz dostęp do $

Odniesienie: https://api-platform.com/docs/core / Filtry / # Tworzenie-Filtry

1
Youssef Benhssaien 7 październik 2020, 09:36