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 ou require. Nous profiterons du système d'autoload de composer en utilisant la syntaxe use 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");
  }
}