Filtrer et décorer avec les middlewares
À propos des middlewares
1. Cycle de vie de l’application
Un processus invisible, mais complexe, se met en marche chaque fois qu’une requête est effectuée sur une application Laravel, par exemple lorsqu’un visiteur se rend sur une page. La requête traverse en effet une succession de couches avant d’arriver jusqu’à l’application elle-même. Il en est de même pour la réponse, qui à son tour devra tracer son chemin jusqu’au navigateur du client.
Dans un scénario classique, un client va tout d’abord effectuer une requête dans son navigateur. Il peut avoir saisi une URL ou cliqué sur un lien de l’application. La requête est envoyée depuis le navigateur vers le serveur qui a été configuré pour cette application. Dans le contexte d’une application Laravel, la configuration du serveur indique qu’il faut envoyer toutes les requêtes sur la page public/index.php qui a la charge d’initialiser le framework.
L’une des premières étapes de cette initialisation est d’inclure et exécuter le fichier autoload.php de Composer. Ce fichier a pour mission de préparer le chargement des classes à la volée, sans avoir à passer par l’utilisation de l’instruction PHP require. C’est grâce à ce système que les classes sont accessibles automatiquement quand...
Créer un middleware
1. Utiliser Artisan
La façon la plus simple de créer un middleware est d’utiliser Artisan. Appeler la commande make:middleware a pour effet de créer une structure de base de middleware dans le dossier réservé à cet usage : app/Http/Middleware.
Création d’un middleware pour vérifier si un utilisateur est administrateur
php artisan make:middleware IsAdmin
2. Structure d’un middleware
Un middleware est une classe qui contient une fonction handle dont la signature contient deux arguments : un objet de type Request nommé $request qui représente la requête en cours et un objet Closure nommé $next qui représente l’étape suivante.
Pour signifier que le middleware a bien été traversé et que le cycle de vie de l’application peut continuer son cours, traversant de nouveaux middlewares pour arriver jusqu’au traitement dans les contrôleurs, la dernière instruction de la fonction handle du middleware doit appeler l’objet $next avec l’objet $request en paramètre.
Le code ci-dessous représente une classe middleware minimale, qui sera simplement traversée sans effectuer aucune action ni vérification. Cette classe ne sert donc à rien, si ce n’est à illustrer le concept de middleware.
Middleware passe-plat
<?php
namespace...
Utiliser un middleware
1. Middleware global
Un middleware global est un middleware qui s’exécute à chaque appel d’une page, peu importe laquelle, autrement dit à chaque requête HTTP.
Par défaut, Laravel propose déjà une série de middlewares globaux. Le middleware CheckForMaintenanceMode permet de vérifier si l’application est en mode maintenance avant de continuer. Si c’est le cas, il renvoie une réponse immédiatement, sous la forme d’une exception. TrimStrings de son côté supprime les espaces au début et à la fin de toutes les chaînes de caractères envoyées en paramètres par l’utilisateur, que ce soit par le biais d’une requête HTTP GET, POST ou PUT. Ainsi, la requête est nettoyée avant même d’avoir atteint sa route.
Un middleware global sert donc à effectuer une action à chaque requête et évite ainsi une duplication de code au début des contrôleurs, ou d’avoir à encadrer toutes les routes par un middleware non global (voir la suite du chapitre). Il s’agit donc d’actions que l’on souhaite réaliser à chaque fois, quel que soit le contexte. Si par exemple, l’application dans son ensemble est limitée à une certaine adresse IP, il est possible de créer un middleware qui aura la charge de faire respecter cette règle.
Pour déclarer un middleware global, ajoutez-le dans la liste des middlewares globaux déjà déclarés. Cette liste se trouve dans le fichier app/Http/Kernel.php, plus précisément dans la propriété $middleware de la classe App\Http\Kernel.
Déclaration d’un middleware global, dans le fichier app/Http/Kernel.php
protected $middleware = [
// Middlewares existants.
// Note : Les espaces de nom ont été retirés pour
// une meilleure lisibilité.
CheckForMaintenanceMode::class...