Article
Laravel : Cycle de vie d'une requête
Dans cet article, on va voir le cycle de vie d'une requête vers une application Laravel avec tout ce qui se passe entre la requête et le rendu final qu'il obtient.
Dans cet article, on va voir le cycle de vie d'une requête vers une application Laravel avec tout ce qui se passe entre le moment où un utilisateur se rend sur le site internet et le rendu final qu'il obtient. L'objectif n'est pas de présenter techniquement comment tout marche exactement mais de voir les grandes lignes.
Avant d'aller plus loin, si vous avez besoin d'une vision d'ensemble sur le framework, je vous invite à consulter mon compendium sur le sujet et notamment sa section sur le routing Laravel.
Tout d'abord, avant d'atteindre vos fichiers PHP, une requête va passer par un serveur HTTP comme Apache ou NGINX. En fonction de l'URL demandée et de la configuration, ce dernier va diriger la requête vers un processus capable d'interpréter le PHP.
Pour Laravel, ces serveurs sont configurés pour rediriger toutes les requêtes sur le fichier public/index.php
Dans le cas de la commande php artisan serve
, c'est le serveur inclus dans la CLI PHP qui est utilisé. Les fichiers sont directement passés à l'interpréteur PHP et server.php
sert de redirection vers public/index.php
pour les URL qui n'existent pas directement sur le disque.
Que se passe-t-il dans index.php ?
C'est lui qui contient l'intégralité du cycle de vie de la requête. Voici le code source du fichier :
<?php
define('LARAVEL_START', microtime(true));
require __DIR__.'/../vendor/autoload.php';
$app = require_once __DIR__.'/../bootstrap/app.php';
$kernel = $app->make(Illuminate\\Contracts\\Http\\Kernel::class);
$response = $kernel->handle( $request = Illuminate\\Http\\Request::capture() );
$response->send();
$kernel->terminate($request, $response);
Le fichier n'est pas très grand, on va voir séparément chaque instruction.
define('LARAVEL_START', microtime(true));
Il définie une constante LARAVEL_START qui a pour valeur le timestamp actuel.require __DIR__.'/../vendor/autoload.php';
Il inclut le fichier autoload généré par composer. L'autoload est responsable du chargement de tous les classes PHP définies dans le dossier app et dans toutes les dépendances.
$app = require_once __DIR__.'/../bootstrap/app.php';
Il inclut le fichier responsable du démarrage du framework.Dans ce fichier, il enregistre notamment le lien entre l'interface Illuminate\\Contracts\\Http\\Kernel::class
et la classe App\\Http\\Kernel::class
. Cela permet de transformer chaque création de l'interface en création de la classe.
$kernel = $app->make(Illuminate\\Contracts\\Http\\Kernel::class);
Création d'un Kernel Http (App\\Http\\Kernel
).$response = $kernel->handle( $request = Illuminate\\Http\\Request::capture() );
Récupération des informations de la requête, traitement et récupération de la réponse.$response->send();
Il envoie la réponse.$kernel->terminate($request, $response);
Si l'architecture utilisée le permet, il appelle les fonctions terminate
des middlewares utilisés au cours de la requête.Le traitement de la requête
Tout d'abord, l'application bootstrap et enregistre tous les services providers. C'est à ce moment là qu'une Form request est autorisée et validée.
La requête passe alors dans les middlewares définis globalement pour l'application, dans le champ middleware
de la classe App\\Http\\Kernel
. Ensuite, elle est envoyé au router qui est chargé de trouver la route correspondante.
S'il en trouve une, il appelle les middlewares définis pour la route ou les groupes dans laquelle elle figure.
Enfin, le router appelle la fonction définie pour la route et crée une réponse grâce au retour de la fonction du Controller.