Le framework Laravel fournit des middlewares notamment pour le système d’authentification. C’est super, mais qu’est-ce que c’est et à quoi ça sert ?
Qu’est ce qu’un middleware ?
Un middleware est une fonction qui s’interpose entre l’appel de la route et l’exécution du code qui est appelé par cette route.
En gros, ça sert à automatiser certaines tâches. Par exemple, si on observe le HomeController.php
, on voit que le middleware auth
est déclaré dans son constructeur. Cela signifie que toutes les méthodes de ce contrôleur qui seront appelées, comme la méthode index()
, le middleware auth
sera exécuté avant. C’est très pratique car on saura directement si l’utilisateur est authentifié ou pas, sans avoir besoin d’écrire du code explicite pour faire cela.
Comment ça fonctionne ?
On va regarder le fichier app/Http/Kernel.php
pour comprendre.
La classe Kernel ne contient pas de méthode mais 3 tableaux :
$middleware
qui contient les middleware qui fonctionnent par défaut sur toute l’application$middlewareGroups
contenant les middleware qui pourront être associés à des groupes de routes.$routeMiddleware
qui contient les middleware qui pourront être associés à différentes routes, qu’elles soient en groupe ou qu’elles soient individuelles.
Un middleware, comme authenticate.php
par exemple, contient une fonction handle
qui prend en paramètre la requête et une closure (une fonction à exécuter).
Créer notre middleware
On va créer un nouveau fichier via la commande qui va nous créer le canvas de la classe :
php artisan make:middleware Ip
On pourrait compléter notre fonction handle
afin de récupérer l’ip de l’utilisateur (pour la stocker dans une table par exemple).
public function handle($request, Closure $next){ /* notre code ici */ $current_ip = $request->ip(); var_dump($current_ip); /* traitement de l'ip et insertion dans une table de comptage de visite par exemple */ return $next($request); }
Utiliser notre middleware de façon globale
Pour pouvoir utiliser notre middleware « Ip
« , on va le renseigner dans kernel.php
.
Comme on veut récupérer l’ip sur n’importe quelle page, on va l’ajouter dans $middleware
.
/* Kernel.php */ /* ... */ protected $middleware = [ \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, \App\Http\Middleware\TrimStrings::class, \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, \App\Http\Middleware\Ip::class ]; /* ... */
Notre middleware est maintenant actif sur toute notre application.
Utiliser notre middleware sur une route (url) spécifique
Si on voulait utiliser notre middleware sur une route particulière, ce serait dans le tableau $routeMiddleware
, ou pour un groupe de route, ce serait dans $middlewareGroups
.
/* Kernel.php */ /* ... */ protected $routeMiddleware = [ 'auth' => \Illuminate\Auth\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, 'can' => \Illuminate\Auth\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'ip' => \App\Http\Middleware\Ip::class ];
Puis on ajouterait ce middleware sur la route que l’on souhaite cibler :
/*routes/web.php */ /* ... */ Route::get('/', function () { return view('welcome'); })->middleware('ip'); /* ... */
Maintenant, quand on arrive sur la page « home », le middleware Ip
va faire afficher notre ip (ici je suis en localhost) :
Lien officiel de la doc : https://laravel.com/docs/5.4/middleware
Vous aimez mes articles ? Offrez-moi un café !
bonjour j’ai hebergé mon apllication sur planethoster mais les middlewares ne fonctionnne pas impossible de rediriger
Super, j’ai passé mon apres-midi à essayer de comprendre le fonctionnement des pages d’authentification générées automatiquement avec Artisan. Avec votre article, ça me clarifie et résume l’essentiel de cette gestion. Merci
Je suis contente d’avoir aidé 🙂
bonjour j’ai hebergé mon apllication sur planethoster mais les middlewares ne fonctionnne pas impossible de rediriger
cool vous ete formidable
ahah merci 🙂