« Précédent Suivant »

Le contrôleur (Controller)


Intro

Un contrôleur est une fonction PHP que vous créez qui lit les informations de l'objet Request et crée et renvoie un objet Response. La réponse peut être une page HTML, JSON, XML, un téléchargement de fichier, une redirection, une erreur 404 ou quoi que ce soit d'autre. Le contrôleur exécute la logique arbitraire dont votre application a besoin pour rendre le contenu d'une page.

Des méthodes controller

En réalité, le fichier "Controller" peut héberger plusieurs contrôleurs qui sont des méthodes.

Dans l'exemple précédent:

<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class HomeController extends AbstractController
{
    #[Route('/home', name: 'app_home')]
    public function index(): Response
    {
        return $this->render('home/index.html.twig', [
            'controller_name' => 'HomeController',
        ]);
    }
}

La première méthode index() admet un attribut #[Route('/home', name: 'app_home')]. Cet attribut définie la route, c'est à dire le chemin qui mène à la méthode. Nous pouvons y ajouter des paramètres.

Des paramètres

Par exemple, ajoutons un nom et utilisons le.

    #[Route('/home/{nom}', name: 'app_home')]
    public function index($nom): Response
    {
        return $this->render('home/index.html.twig', [
            'nom' => $nom,
            'controller_name' => 'HomeController',
        ]);
    }

Le nom s'ajoute à la fin de l'url et symfony le récupère pour l'injecter dans la méthode index($nom) puis nous l'envoyons vers la vue dans le tableau associatif de render().

Cette méthode render() est héritée, parmi d'autres de AbstractController. Je vous invite à regarder dans le fichier AbstractController.php pour voir toutes les autres méthodes disponibles.

Pour l'exemple, vous pouvez modifier templates/home/index.html en:

{% extends "base.html.twig" %}

{% block body %}
<h1>Salut {{nom}}</h1>
{% endblock %}

Dans Twig, pour récupérer les données envoyées par le contrôleur, nous n'avons qu'à piocher dans le tableau associatif. Ici {{nom}} fait référence à la clé nom dans le tableau.

Si vous allez à l'url localhost:8000/home/Paul vous devriez avoir:

route-param

Ajoutons des routes

Comme vous vous ête peut être rendu compte, localhost:8000 vous mène à une erreur de type 404. C'est tout à fait normal car nous n'avons pas de route menant à cette page.

Ajoutons en une. Pour ce faire, il n'est pas nécessaire de recréer un contrôleur. Il faut simplement ajouter une nouvelle méthode au contrôleur existant.

En dessous de la première méthode écrivons:

#[Route('', name: 'app_accueil')]
    public function accueil()
    {
        return $this->render('home/accueil.html.twig');
    }

et créons (dans le dossier templates/home/) un fichier modèle accueil.html.twig:

{% extends "base.html.twig" %}
{% block body %}
    <h1>Accueil</h1>
{% endblock %}

Puisque nous avons laissé vide le premier paramètre de Route( ... ), à la racine du site nous allons trouver maintenant:

accueil-1

Le debugger

Pour connaitre les routes que nous avons mis à disposition, il est possible de taper en console symfony console debug:router

router