Aller au contenu principal

Les filtres

Il est intéressant de disposer d'endpoints REST automatiquement créés, mais on voudrait peut-être pouvoir filtrer nos données.

API Platform intègre un système de filtres très utile : on pourra filtrer la collection voulue directement à l'aide de paramètres GET dans l'URL.

Bien sûr, au niveau de la classe concernée, on devra configurer ces filtres au préalable.

Seulement les articles visibles​

API Platform intègre un BooleanFilter, qu'on peut appliquer directement au niveau de la déclaration de la ressource :

#[ApiResource(
normalizationContext: ['groups' => ['articles:read']]
)]
#[ApiFilter(BooleanFilter::class, properties: ['visible'])]
class Article
{
}
remarque

On voit qu'on peut indiquer plusieurs propriétés dans properties, au besoin

Ensuite, depuis un client, il suffit d'indiquer les articles qu'on souhaite, visibles ou non. Demandons seulement les articles visibles :

http://localhost:8000/api/articles?visible=true

Si on n'utilise pas le filtre, tous les articles seront affichés. Sinon, avec le filtre, on pourra choisir avec true ou false les articles qu'on souhaite.

Par nom ou partie de nom​

Pour des besoins se rapprochant d'un moteur de recherche, on peut également utiliser le SearchFilter :

#[ApiResource(
normalizationContext: ['groups' => ['articles:read']]
)]
#[ApiFilter(BooleanFilter::class, properties: ['visible'])]
#[ApiFilter(SearchFilter::class, properties: ['title' => 'ipartial'])]
class Article
{
}
ipartial

Le i signifie insensible à la casse

On peut ainsi rechercher par titre d'article :

http://localhost:8000/api/articles?title=last

Et si on veut seulement les visibles également, on indiquera un paramètre GET de plus :

http://localhost:8000/api/articles?visible=true&title=last

Par nom de catégorie (ou partie)​

On peut même aller plus loin, en appliquant un SearchFilter sur l'attribut de catégorie pour aller cibler son nom :

#[ORM\ManyToOne(inversedBy: 'articles')]
#[ORM\JoinColumn(nullable: false)]
#[Groups('articles:read')]
#[ApiFilter(SearchFilter::class, properties: ['category.name' => 'ipartial'])]
private ?Category $category = null;

Puis, pour rechercher :

http://localhost:8000/api/articles?visible=true&category.name=pariat

Personnalisation / Extension​

Il existe de nombreux filtres proposés par défaut dans API Platform. Dans le même esprit que les composants Symfony, API Platform est conçu pour être étendu. On aura donc la possibilité de créer ses propres filtres si besoin.