Le Cercle des Mages est au régime : « Rien au-dessus de 4 pièces d'or, et seulement des boissons, merci. » Plutôt que de télécharger toute la carte et de trier eux-mêmes, les parchemins veulent filtrer :
/api/plats?categorie=Boissons&prixMax=4&tri=nom
Votre mission
- Complétez le DTO
FiltreCarte, avec trois paramètres facultatifs :categorie: le nom exact d'une catégorie ;prixMax: le prix maximum, compris, et supérieur à zéro ;tri:prix(par défaut) ounom. L'enumTriest fourni.
- Ajoutez
PlatRepository::findAvecFiltre(FiltreCarte $filtre), qui applique les filtres renseignés et l'ordre demandé. - Dans
GET /api/plats, recevez les filtres avec#[MapQueryString]. Sans aucun paramètre, la carte reste complète, triée par prix. - Un filtre invalide (
?prixMax=-3,?prixMax=beaucoup,?tri=couleur) doit donner 400 Bad Request.
#[MapQueryString]
C'est le cousin de #[MapRequestPayload], mais pour la query string. Symfony convertit chaque paramètre vers le type de la propriété ("4" → 4.0, "nom" → Tri::Nom), puis valide le DTO.
Attention au code d'erreur : par défaut, une query string invalide donne 404, comme pour une page introuvable. Pour une API, 400 est plus juste : réglez-le avec validationFailedStatusCode.
Et l'injection SQL ?
Le tri finit dans la requête (orderBy('p.'.…)). Grâce à l'enum, sa valeur ne peut être que prix ou nom : Symfony refuse tout le reste avant même d'appeler votre code.