Nicolas KEMPF

Nicolas KEMPF / Développement  / Laravel : Cycle de vie d’une requête

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 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.

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. Ce dernier 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);

Ici, il crée un Kernel Http (App\\Http\\Kernel).

$response = $kernel->handle(
    $request = Illuminate\\Http\\Request::capture()
);

Il récupère toutes les informations concernant la requête. Le kernel est ensuite utilisé pour traiter la requête et récupérer la réponse correspondante. Nous verrons en détails cette étape plus tard.

$response->send();
$kernel->terminate($request, $response);

Il envoie la réponse et 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, la requête passe 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 et la fonction en rapport puis il crée une réponse grâce au retour de la fonction du Controller.

Nicolas KEMPF