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
{
}
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
{
}
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.