Contrôleurs
Si on lance le serveur juste après l'installation de l'application, nous constatons que nous n'avons aucune page d'accueil. A la place, Symfony prévoit une page d'accueil spéciale indiquant la version de Symfony installée, et un message nous précisant que nous voyons cette page parce que nous n'avons pas configuré de page d'accueil.
Créer un contrôleur
Un contrôleur permet de réceptionner et traiter une requête au sein de l'application
En utilisant la console et le MakerBundle, nous allons créer le premier contrôleur de notre application, qui sera configuré pour s'exécuter sur la page d'accueil.
php bin/console make:controller
On va nommer la classe IndexController, puis consulter le contenu du fichier src/Controller/IndexController.php créé par le maker.
On peut aussi utiliser la commande php bin/console make:controller IndexController pour que la console crée directement le fichier, sans nous demander le nom de la classe de contrôleurs
La classe de contrôleurs
Dans la classe créée par le maker, on trouve une fonction index, qui va renvoyer une Response. C'est le principe de base de Symfony : le modèle Requête/Réponse. Un contrôleur est chargé d'être exécuté pour une route donnée (une URL, donc). Il va donc recevoir une requête, puis générer une réponse pour le client ayant effectué la requête.
Un point sur la classe de contrôleurs : cette classe étend une classe abstraite AbstractController, c'est cette classe abstraite qui lui fournit les capacités d'un contrôleur. Par ailleurs, on rappelle qu'avec l'auto-chargement PSR-4, le namespace de notre contrôleur est donc App\Controller, puisqu'il se situe dans le dossier src/Controller
HttpFoundation
Le modèle Requête/Réponse est entièrement géré par un package de Symfony : symfony/http-foundation.
En résumé, ce package fournit une interface orientée objet permettant de représenter une requête et une réponse HTTP. Au lieu d'utiliser les variables superglobales $_GET et $_POST par exemple, on utilisera les attributs query et request d'une classe Symfony\Component\HttpFoundation\Request.
L'attribut Route
Au-dessus de la signature de cette fonction, on trouvera un attribut Route, issu du composant Routing de Symfony :
// use Symfony\Component\Routing\Attribute\Route;
// ...
#[Route('/index', name: 'app_index')]
C'est grâce à cet attribut que nous pourrons définir l'URL associée à notre route, le nom de la route, les méthodes HTTP autorisées, etc...c'est donc la méthode index qui représente ici notre contrôleur.
Avant PHP8, les routes étaient écrites sous forme d'annotations. Les annotations étaient ensuite analysées par des packages afin d'enregistrer la route.
La syntaxe était donc différente, comme des commentaires :
/**
* @Route("/index", name="app_index")
*/
public function index(): Response
{
//...
}
Avec PHP8, les attributs sont intégrés au langage PHP, et permettent de ne plus avoir à s'appuyer sur des packages externes qui analysent des commentaires
Dans une application Symfony, on créera donc un ensemble de routes. Par la suite, on pourra alors rediriger l'utilisateur vers une route, ou bien générer un lien vers une page à partir du nom de sa route, etc...
Le rôle d'un contrôleur
Le rôle de base d'un contrôleur étant de communiquer avec les modèles puis de demander le rendu d'une vue, on trouve l'instruction $this->render('...', [...]);.
Ce contrôleur va déclencher le rendu d'un template, qui sera la vue, l'affichage de notre page.
La commande php bin/console make:controller a créé un autre fichier templates/index/index.html.twig. Il s'agit du fichier de vue appelé par notre contrôleur.
Un contrôleur sera donc chargé d'exécuter la logique de notre application. Comme dit plus tôt, il pourra communiquer avec le modèle pour récupérer des données, puis fournir ces données à la vue, le template d'affichage
Dans un modèle MVC (Modèle-Vue-Contrôleur) :