5. Premier Contrôleur
5.1. Qu'est ce qu'un contrôleur
Les contrôleurs qui dérivent de la classe AbstractController permettent de réaliser des actions et sont
associés à des routes qui les identifient.
Une route est définie à partir de la racine du site localhost:8000/ et peut contenir des paramètres.
Nous utiliserons, par exemple, la route /conducteur/supprimer/{id} afin de supprimer un conducteur dans
la base de données.
La partie {id} située en fin de route représente l'identifiant du conducteur à supprimer, si on désire
supprimer le conducteur d'identifiant 3, on appellera la route :
localhost:8000/conducteur/supprimer/3
Une route peut donc être :
- /conducteur/lister : constante
- /conducteur/supprimer/{id} : ou dynamique si elle possède un paramètre
Il est important de bien organiser les routes afin de garder une cohérence qui est nécessaire quand on développe un site web
d'envergure.
5.2. Création d'un premier contrôleur général
Dans le répertoire src, créez un sous-répertoire Controller, puis créer
un fichier GeneralController.php qui sera chargé de gérer deux routes :
- /, la route qui permet de charger la page principale du site soit index.php
- /drop/tables, dont le but est de vider la base de données
Le code de la classe GeneralController est le suivant :
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\DBAL\Connection;
/**
* Contrôleur global
*/
class GeneralController extends AbstractController
{
// connexion à la base de données
private $connexion;
/**
* Constructeur prenant en paramètre la connextion à la base de données
*/
public function __construct(Connection $connexion)
{
$this->connexion = $connexion;
}
/**
* Route / qui pointe sur index.php
*/
#[Route('/', name: 'index')]
public function homepage(Request $request,
EntityManagerInterface $entityManager) : Response {
return $this->render("base.html.twig");
}
/**
* Route qui permet de supprimer toutes les tables de la base de données
* cette route est utilisée pour des tests et le débogage
*/
#[Route('/drop/tables', name: 'drop_tables')]
public function drop_tables(Request $request,
EntityManagerInterface $entityManager) : Response {
// Execute the SQL statement
$this->connexion->executeStatement('DROP TABLE IF EXISTS equipement_vehicule');
$this->connexion->executeStatement('DROP TABLE IF EXISTS vehicule');
$this->connexion->executeStatement('DROP TABLE IF EXISTS equipement');
$this->connexion->executeStatement('DROP TABLE IF EXISTS conducteur');
//
// On aurait pu utiliser le code suivant pour afficher
// la page index
//
// return $this->render("base.html.twig");
//
// Cependant il est préférable d'utiliser le code ci-dessous, car sinon
// c'est la route /drop/tables qui est gardée au sein de l'URL
//
return $this->redirectToRoute('index');
}
}
Le contrôleur comporte un constructeur qui prendra par défaut lorsqu'il sera créé une connexion à la de données.
On introduit lignes 4 à 7 les classes de Symfony qui sont liées à l'utilisation du contrôleur :
- AbstractController : la classe de bases qui contient les fonctionnalités liées à la gestion d'un contrôleur
- Request : qui gère les paramètre en entrée lors d'une requête HTML
- Response : qui se charge de gérer ce qui sera retourné, généralement du code HTML
- Route : qui nous permet de définir les routes
5.2.1. La route /
Le première route / doit posséder également un nom qui permet de l'identifier lors d'une redirection.
Elle est associée à une fonction, ici homepage qui prend deux paramètres qui seront renseignés par Symfony et
retourne une valeur de type Response qui correspondra à du code HTML.
Le contrôleur se content de retourner le code du fichier templates/base.html.twig.
5.2.2. La route /drop/tables
Le seconde route /drop/tables, nommée également par drop_tables, supprime le contenu
des tables de la base de données puis retourne sur la page d'accueil du site.
Cette route est introduite afin de faciliter la réinitialisation de la base de données mais devra être supprimée lorsque
le site sera mis en production.