📘

RequĂȘtes HTTP

Parcours d’une requĂȘte HTTP sous Symfony


  1. Le client via le navigateur tape une URL et arrive sur notre application.
  1. Il arrive sur index.php (dans public), qui retourne juste une instance de la classe kernel.php.
â„č
Le Kernel est le noyau de Symfony, qui connait toutes les routes et le contrĂŽleur correspondant qu’il faut appeler. Il est chargĂ© de gĂ©rer la requĂȘte et de retourner une rĂ©ponse. On n’y touche jamais. Il gĂšre les correspondances entre routes (URL) et traitements : nous, on dĂ©veloppe les mĂ©thodes nĂ©cessaires au traitement.
⚠
Il n’y a pas de servlets mais des contrîleurs en Symfony.
  1. Selon la route choisie, le kernel dirige vers le contrÎleur concerné, qui appelle le Twig associé qui, lui, retourne la page HTML.
â„č
Le Twig est un moteur de templates. Lors de l’appel d’un Twig, le template voulu est compilĂ© pour crĂ©er la bonne page HTML et l’afficher.
⚠
Il n’y a pas de JSP mais des Twigs en Symfony.
  1. Pour afficher le Twig, le contrĂŽleur requĂȘte une base de donnĂ©es via l’entitĂ© concernĂ©e.
⚠
Le modĂšle (ou BO) n’est pas composĂ© de classes mais d’entitĂ©s en Symfony.
â„č
Les liens entre entitĂ©s et base de donnĂ©es sont gĂ©rĂ©s par Symfony (on ne s’en occupe pas).

Quand quelqu’un arrive sur le site, une instance de Request est créée. La requĂȘte au serveur se fait donc par une URL et est gĂ©rĂ©e par le fichier .htaccess, qui redirige forcĂ©ment sur index.php et bloque l’accĂšs aux autres dossiers.

Le systÚme de routage se fait avec une URL qui correspond à une méthode. Chaque URL est appelée une route et porte un nom unique.

⚠
On peut avoir autant de contrĂŽleurs avec autant de mĂ©thodes qu’on veut, par contre une seule mĂ©thode correspond Ă  une seule URL. Attention parce que ça ne crĂ©e pas d’erreurs, le systĂšme de routage prendra juste la premiĂšre route trouvĂ©e donc il faut s’auto-gĂ©rer.

Les contrÎleurs contiennent les fonctions appelées par le systÚme de routage. Un contrÎleur peut contenir plusieurs fonctions et donc correspondre à plusieurs routes.

Ils héritent de AbstractController, qui connait toutes les méthodes servant à retourner des réponses HTTP, grùce au paquet ...\HttpFoundation\Response.

⚠
Il n’y a pas d’imports mais des use en Symfony. Il n’y a pas de packages mais des namespace en Symfony, qui indiquent oĂč se trouve le chemin depuis “App” (src).

Le moteur de templates remplace le PHP et gĂ©nĂšre du HTML, ce qui simplifie la lecture et l’écriture. Il correspond Ă  la Vue du modĂšle MVC.

â„č
D’autres templates existent, par dĂ©faut Twig est utilisĂ©.

Conventions :

- dans le dossier templates/ - une extension .html.twig

- un fichier twig par méthode de contrÎleur

- le mĂȘme nom que la mĂ©thode associĂ©e (ça va bloquer sinon)

- dans un sous-dossier qui porte le mĂȘme nom que le contrĂŽleur

- sans majuscules (snake_case pour les noms de méthodes)

Pour dĂ©clencher l’affichage du fichier twig, on met un return dans la mĂ©thode du contrĂŽleur qui conduit vers le twig : $this->render("main/home.html.twig");.

Premiers contrĂŽleur et Twig


Dans le terminal de l’IDE (ici, PhpStorm) :

â„č
Quand il y a une erreur, Symfony propose une solution : s’il manque un paquet, il en propose un qui semble convenir et dit comment le tĂ©lĂ©charger.

Tout est pré-défini et généré.

C’est une classe PHP qui hĂ©rite bien de AbstratController, avec une mĂ©thode index() Ă  modifier Ă  façon.

BP : Le nom de la route est par convention “nomducontroleur_nomdelamethode”. Il y a beaucoup de routes, il faut s’appliquer.
<?php

namespace App\Controller;

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

class HomeController extends AbstractController
{
    #[Route('/', name: 'home_index')]
    public function index(): Response
{
      return $this->json([
          'message' => 'Welcome to your new controller!',
          'path' => 'src/Controller/HomeController.php',
      ]);
}

Le # peut ĂȘtre appelĂ© mĂ©tadata ou attribut : le Kernel lit cette ligne pour connaĂźtre le nom unique et l’url liĂ©s Ă  cette mĂ©thode.

â„č
L’attribut est nouveau, il apparaüt en PHP8. Avant, on utilisait des annotations :
class HomeController extends AbstractController
{
		/**
		* @Route('/', name= 'home_index')
		*/
    public function index(): Response
{
      return $this->json([
          'message' => 'Welcome to your new controller!',
          'path' => 'src/Controller/HomeController.php',
      ]);
}

Lorsqu’on lance le serveur symfony server:start et qu’on Ă©crit l’url voulue du contrĂŽleur, le rĂ©sultat de la fonction s’affiche.

â„č
Pour l’instant, une route = une mĂ©thode. AprĂšs on pourra mettre des regex !

Néanmoins, on ne veut pas du JSON mais du HTML : on télécharge le moteur de templates Twig : composer require twig.

On modifie le contrîleur pour qu’il retourne un Twig :

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

Le fichier Twig n’existe, l’IDE propose de le crĂ©er.

Il est maintenant disponible dans templates/home/index.html.twg.

On peut y ajouter du html et lorsqu’on va sur l’url, la page HTML s’affiche.

<!doctype html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <title>Hello Symfony</title>
</head>
<body>
    <h1>Un premier Twig</h1>
    <p>C'est ma page d'accueil.</p>
</body>
</html>

â„č
Maintenant qu’on a tĂ©lĂ©charger le paquet twig, quand on crĂ©e un nouveau contrĂŽleur, Symfony fait tout mĂȘme le retour de Twig de la fonction du contrĂŽleur.
â„č
Il est possible de copier le composer.json d’autre projet et lancer composer install que Symfony installe directement tous les paquets prĂ©sents dans le fichier.
â„č
Le fichier composer.lock est une version vĂ©rrouillĂ©e du composer.json. C’est une sĂ©curitĂ© contre la red team (on peut le supprimer pour ajouter ou supprimer des paquets, il sera recrĂ©er automatiquement).

📌
Pour aller plus loin : - SensioLabs - Les Tilleuls coop - Certification Symfony

Parcours d’une requĂȘte HTTP