La carte sur parchemin

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

Notions abordées : API JSON$this->json()Serializer#[Groups]

La Guilde des Aventuriers vient d'équiper ses membres de parchemins magiques : on y consulte les tavernes de la région, on y réserve sa table… Gorm veut que le Dragon Ivre y figure. Seulement, les parchemins ne lisent pas le HTML : ils parlent JSON.

Première étape : publier la carte.

Votre mission

Dans Api\CarteController::plats() (GET /api/plats), renvoyez la carte en JSON, du moins cher au plus cher :

[
    {
        "slug": "pain-du-voyageur",
        "nom": "Pain du voyageur",
        "description": "Une bouchée suffit pour une journée de marche…",
        "prix": 2.5,
        "specialite": false,
        "categorie": { "nom": "Accompagnements" }
    }
]

Pour essayer vos réponses, utilisez l'onglet Requêtes, à côté de l'aperçu. Ses boutons préparent des requêtes toutes faites.

Essayez d'abord la version naïve

$this->json($platRepository->findParPrixCroissant()), et regardez ce qui se passe. Le Serializer transforme les objets en tableaux en lisant tous leurs getters. Il suit donc aussi les relations : getCategorie(), puis getPlats() de la catégorie, puis ces plats… Il y a aussi getCreateur(), qui publierait l'e-mail et le hash du mot de passe de Bruna !

La bonne méthode : les groupes

Décidez explicitement de ce qui est public. Marquez chaque propriété à publier d'un #[Groups(['carte'])], puis demandez ce groupe au Serializer :

return $this->json($donnees, context: ['groups' => ['carte']]);

Une propriété sans groupe n'est plus publiée. C'est le bon réflexe pour une API : tout ce qui n'est pas explicitement public reste privé.