Ein eigener Filter
Ein eigener Filter
~15 Min. Lesezeit Zuletzt aktualisiert am 8. August 2026
Die eingebauten Filter decken die MEISTEN Fälle ab – für eine Volltextsuche über MEHRERE Felder mit EINEM einzigen Parameter braucht es einen EIGENEN Filter.
Wann ein eigener Filter nötig ist
- EIN Parameter soll GLEICHZEITIG mehrere Felder durchsuchen (z. B.
?q=relaunchsucht innameUNDdescription). - Die Filterlogik hängt von MEHR ab als einem einfachen Datenbank-Vergleich (z. B. eine Ähnlichkeitssuche).
- Berechnete/virtuelle Felder aus Kapitel 25 sollen ebenfalls filterbar sein (die eingebauten Filter arbeiten NUR auf echten Datenbankspalten).
Die Filter-Klasse anlegen
<?php
declare(strict_types=1);
namespace App\Filter;
use ApiPlatform\Doctrine\Orm\Filter\AbstractFilter;
use ApiPlatform\Metadata\Operation;
use Doctrine\ORM\QueryBuilder;
final class MultiFieldSearchFilter extends AbstractFilter
{
protected function filterProperty(
string $property,
mixed $value,
QueryBuilder $queryBuilder,
\ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface $queryNameGenerator,
string $resourceClass,
?Operation $operation = null,
array $context = [],
): void {
if ('q' !== $property || !\is_string($value)) {
return;
}
$alias = $queryBuilder->getRootAliases()[0];
$parameter = $queryNameGenerator->generateParameterName('q');
$queryBuilder
->andWhere("{$alias}.name LIKE :{$parameter} OR {$alias}.description LIKE :{$parameter}")
->setParameter($parameter, '%' . $value . '%');
}
public function getDescription(string $resourceClass): array
{
return [
'q' => [
'property' => null,
'type' => 'string',
'required' => false,
'description' => 'Durchsucht name UND description gleichzeitig.',
],
];
}
}filterProperty() wird für JEDEN Query-Parameter aufgerufen, der zur Resource passt – die Prüfung 'q' !== $property stellt sicher, dass der Filter NUR auf den EIGENEN Parameter q reagiert. getDescription() liefert die Metadaten für Swagger UI, GENAU wie bei den eingebauten Filtern.
Den Filter registrieren
use App\Filter\MultiFieldSearchFilter;
#[ApiFilter(MultiFieldSearchFilter::class)]
KEIN properties-Array nötig – der Filter definiert seinen EIGENEN Parameternamen SELBST über getDescription().
Den eigenen Filter testen
curl -k 'https://localhost/api/projects?q=redesign'Findet Projekte, bei denen "redesign" ENTWEDER im Namen ODER in der Beschreibung vorkommt – EIN Parameter statt zwei separater SearchFilter-Anfragen.
Tipp: Das AbstractFilter-Grundgerüst ist BEWUSST ähnlich zu einem QueryBuilder aus der Symfony-Schulung (Kapitel 21) aufgebaut – WER dort bereits eigene Repository-Methoden mit QueryBuilder geschrieben hat, findet sich hier SOFORT zurecht.