Filtrer la carte

Exercice 5 sur 6 du chapitre 5 · 240 XP · 5 objectifs vérifiés par des tests

Notions abordées : #[MapQueryString]EnumQueryBuildervalidationFailedStatusCode

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

  1. 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) ou nom. L'enum Tri est fourni.
  2. Ajoutez PlatRepository::findAvecFiltre(FiltreCarte $filtre), qui applique les filtres renseignés et l'ordre demandé.
  3. Dans GET /api/plats, recevez les filtres avec #[MapQueryString]. Sans aucun paramètre, la carte reste complète, triée par prix.
  4. 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.