Contrôleur Symfony : une route, une action, une réponse
Un contrôleur Symfony est une classe PHP dont chaque action, reliée à une URL par l'attribut #[Route], reçoit la requête et renvoie une Response.
class MenuController extends AbstractController { #[Route('/menu', name: 'app_menu')] public function index(): Response { return $this->render('menu/index.html.twig', [ 'plats' => ['Ragoût du nain grincheux', 'Tourte elfique aux champignons', 'Hydromel du dragon'], ]); } }
Le routeur associe l'URL à l'action, puis Symfony l'appelle avec des arguments déjà résolus : paramètres de route, services, ou valeurs tirées de la requête par des attributs comme #[MapQueryParameter] ou #[MapRequestHeader]. L'action n'a donc pas toujours besoin de l'objet Request entier. AbstractController apporte les raccourcis render(), redirectToRoute() et createNotFoundException() ; une classe sans parent, avec une méthode __invoke(), fait aussi un contrôleur. Le piège du débutant : écrire $this->render(…) sans return. L'action renvoie alors null, et Symfony s'arrête sur une erreur qui rappelle qu'un contrôleur doit renvoyer une Response, en demandant si l'on n'a pas oublié un return.
Les exercices font déclarer la route /menu de la taverne et rendre la carte dans un template Twig, avec une boucle sur les plats, puis réécrire un contrôleur d'API pour qu'il lise l'en-tête X-Api-Version avec #[MapRequestHeader] plutôt qu'avec l'objet Request, l'absence d'en-tête donnant toujours une erreur 400.
2 exercices font travailler cette notion, en écrivant du code dans le navigateur.
Dans les parcours
Dans la Pratique
- Lire un en-tête avec #[MapRequestHeader] Un en-tête HTTP arrive directement en argument du contrôleur, et son absence donne une 400 sans une ligne de code.