Comprendre Laravel 5.4 : Les middlewares

Share on LinkedInTweet about this on TwitterShare on FacebookShare on RedditShare on Google+

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 :

  1. $middleware qui contient les middleware qui fonctionnent par défaut sur toute l’application
  2. $middlewareGroups contenant les middleware qui pourront être associés à des groupes de routes.
  3. $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

Share on LinkedInTweet about this on TwitterShare on FacebookShare on RedditShare on Google+

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *