Skip to Content
SymfonyPartie 18 — Mini-jeux (exploration guidée)Terrain 3 — Routing & contrôleurs

Terrain 3 — Routing & contrôleurs

🔍 Renfort : Partie 4.

1. Route JSON ⭐

🕹️ Mission : GET /api/version renvoyant { "version": "1.0.0" }.

✅ Solution

#[Route('/api/version', methods: ['GET'])] public function version(): JsonResponse { return $this->json(['version' => '1.0.0']); }

2. Paramètre contraint ⭐

🕹️ Mission : GET /bookings/{id}id doit être un entier.

✅ Solution

#[Route('/bookings/{id<\d+>}', methods: ['GET'])]

3. Préfixe de classe ⭐⭐

🕹️ Mission : préfixez un contrôleur API sur /api/providers (nom api_provider_) avec list + show.

✅ Solution

#[Route('/api/providers', name: 'api_provider_')] final class ProviderApiController extends AbstractController { #[Route('', name: 'list', methods: ['GET'])] public function list() {} #[Route('/{id<\d+>}', name: 'show', methods: ['GET'])] public function show(int $id) {} }

4. Charger l’entité ⭐⭐

🕹️ Mission : faites charger automatiquement un Booking depuis {id} (avec 404 auto). 🔍 4.4.

✅ Solution

#[Route('/bookings/{id<\d+>}', methods: ['GET'])] public function show(Booking $booking): Response { return $this->json($booking); }

5. DTO validé ⭐⭐⭐

🕹️ Mission : POST /api/bookings recevant un DTO CreateBookingInput validé (422 auto). 🔍 4.4.

✅ Solution

#[Route('/api/bookings', methods: ['POST'])] public function create(#[MapRequestPayload] CreateBookingInput $input, BookingCreator $c): JsonResponse { return $this->json($c->create($input), 201); }

6. Bon code HTTP ⭐⭐

🕹️ Mission : une suppression réussie renvoyant 204 sans corps. 🔍 4.3.

✅ Solution

return new Response(null, Response::HTTP_NO_CONTENT);

7. 404 propre ⭐⭐

🕹️ Mission : lever une 404 si une réservation n’existe pas.

✅ Solution

throw $this->createNotFoundException(sprintf('Réservation #%d introuvable.', $id));

8. Query string en objet ⭐⭐⭐

🕹️ Mission : mapper ?page=2&sort=desc dans des scalaires. 🔍 4.4.

✅ Solution

public function list(#[MapQueryParameter] int $page = 1, #[MapQueryParameter] string $sort = 'asc') {}

9. Contrôleur fin ⭐⭐⭐⭐

🕹️ Mission : réécrivez une action « grasse » (30 lignes de règles) en action fine déléguant à un service. 🔍 4.3.

✅ Solution

public function confirm(Booking $b, BookingConfirmer $confirmer): JsonResponse { $confirmer->confirm($b); // toute la logique dans le service return $this->json($b); }

10. Message flash ⭐⭐

🕹️ Mission : après création (back-office), afficher « Réservation créée » via flash + redirection. 🔍 4.5.

✅ Solution

$this->addFlash('success', 'Réservation créée.'); return $this->redirectToRoute('admin_booking_index');

Terrain suivant : Services & DI.