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} où 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.