Un Middleware permet de filtrer les requêtes HTTP entrantes dans l'application. Il se place entre la requête et le reste de l'application.
Il permet de lire les informations de la requête et de faire des actions suivant ces informations.
Par défaut, Laravel est livré avec plusieurs Middleware. Nous avons déjà utilisé le auth
qui permet de rediriger les utilisateurs non identifiés vers la page de connexion.
Les Middleware sont déclarés dans le fichier app/Http/Kernel.php
Il y a 3 tableaux dans ce fichier qui correspondent à 3 types de déclarations.
On peut voir dans le tableau $routeMiddleware
qu'il y a auth
, c'est le middleware qui est utilisé quand on appelle la méthode $this→middleware('auth')
dans le contrôleur ou dans une route.
protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, ... ];
Donc quand on appelle auth
, ça charge le fichier /app/Http/Middleware/Authenticate.php
Les Middleware sont dans le dossier /app/Http/Middleware
Création d'un Middleware Admin
qui permettra de savoir si l'utilisateur connecté est un administrateur
Pour créer le fichier, on peut utiliser php artisan
php artisan make:middleware Admin
Il y a maintenant un fichier dans /app/Http/Middleware
Ajout du code pour vérifier si l'utilisateur est un administrateur. Le code doit être ajouté dans la méthode handle()
public function handle($request, Closure $next) { $user = $request->user(); if ($user && $user->admin) { return $next($request); } return redirect()->route('home'); }
$user
$user→admin
est expliqué dans le chapitre sur les modèles Getter et Setter
il faut maintenant ajouter le Middleware que l'on vient de créer dans le fichier Kernel.php
protected $routeMiddleware = [ ... 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, 'admin' => \App\Http\Middleware\Admin::class, ];
Pour utiliser ce nouveau middleware, on peut l'ajouter à une route par exemple
... Route::middleware('admin')->prefix('admin')->group(function () { Route::resource ('user', 'UserController'); }); ...
Pour accéder au UserController
, il faut que l'utilisateur connecté soit un administrateur.