Contrôleur
Le contrôleur gère la logique du code qui prend des décisions. C'est en quelque sorte l'intermédiaire entre le modèle et la vue : le contrôleur va demander au modèle les données, les analyser, prendre des décisions et renvoyer le texte à afficher à la vue. Le contrôleur contient exclusivement du PHP. C'est notamment lui qui détermine si le visiteur a le droit de voir la page ou non (gestion des droits d'accès).
Eléments importants
- Il s'incrit dans l'espace de nom. Ici
namespace App\Controller;
. Ceci permet de qualifier précisément la classe (il s'agit d'un nom complet). À noter que l'espace de nom détermine aussi le chemin du fichier dans l'arborescence et que le nom du fichier et le nom de la classe doivent correspondre. - Il hérite du contrôleur de Symfony
Symfony\Bundle\FrameworkBundle\Controller\AbstractController
- Afin d'utiliser la classe mère, on n'utilisera pas
include
ourequire
. Nous profiterons du système d'autoload de composer en utilisant la syntaxeuse Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
qui met en œuvre les éléments ci-dessus. - Notre route utilise une méthode appelée
index
(depuis Symfony 4, le méthodes des contrôleurs ne sont plus suffixées par Action).
Réponse
La réponse se fait à travers le retour de la méthode index
. Elle utilise la méthode
render
de la classe AbstractController
pour pouvoir faire appel à une vue.
namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\Routing\Annotation\Route; class DefaultController extends AbstractController { /** * @Route("/default", name="default") */ public function index() { return $this->render('default/index.html.twig', [ 'controller_name' => 'DefaultController', ]); } }
C'est le comportement par défaut d'un contrôleur. Pour des usages très spécifiques, il est possible de contourner ce comportement en forgeant directement le contenu d'une réponse :
namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; class DefaultController extends AbstractController { /** * @Route("/default", name="default") */ public function index() { return new Response("Hello World"); } }