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
includeourequire. 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");
}
}