Recherche…


Introduction

Les intergiciels sont des classes pouvant être affectées à une ou plusieurs routes et utilisées pour effectuer des actions dans les phases initiales ou finales du cycle de demande. Nous pouvons les considérer comme une série de couches à travers lesquelles une requête HTTP doit transiter pendant son exécution.

Remarques

Un middleware "Before" sera exécuté avant le code d'action du contrôleur; tandis qu'un middleware "Après" s'exécute après que la requête est gérée par l'application

Définir un middleware

Pour définir un nouveau middleware, nous devons créer la classe de middleware:

class AuthenticationMiddleware
{
    //this method will execute when the middleware will be triggered
    public function handle ( $request, Closure $next )
    {
        if ( ! Auth::user() )
        {
            return redirect('login');
        }

        return $next($request);
    }
}

Ensuite, nous devons enregistrer le middleware: si le middleware doit être lié à toutes les routes de l'application, nous devons l'ajouter à la propriété middleware de app/Http/Kernel.php :

protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \App\Http\Middleware\AuthenticationMiddleware::class
];

alors que si nous voulons seulement associer le middleware à certaines routes, nous pouvons l'ajouter à $routeMiddleware

//register the middleware as a 'route middleware' giving it the name of 'custom_auth'
protected $routeMiddleware = [
    'custom_auth' => \App\Http\Middleware\AuthenticationMiddleware::class
];

puis liez-le aux routes simples comme ceci:

//bind the middleware to the admin_page route, so that it will be executed for that route
Route::get('admin_page', 'AdminController@index')->middleware('custom_auth');

Avant vs Après Middleware

Un exemple de "avant" middleware serait comme suit:

<?php

namespace App\Http\Middleware;

use Closure;

class BeforeMiddleware
{
    public function handle($request, Closure $next)
    {
        // Perform action

        return $next($request);
    }
}

alors que le middleware "after" ressemblerait à ceci:

<?php

namespace App\Http\Middleware;

use Closure;

class AfterMiddleware
{
    public function handle($request, Closure $next)
    {
        $response = $next($request);

        // Perform action

        return $response;
    }
}

La principale différence réside dans la gestion du paramètre $request . Si des actions sont exécutées avant $next($request) avant que le code du contrôleur ne soit exécuté pendant que l'appel à $next($request) entraîne d'abord l'exécution des actions après l'exécution du code du contrôleur.

Route Middleware

Tout middleware enregistré en tant que routeMiddleware dans app/Http/Kernel.php peut être affecté à une route.

Il y a plusieurs façons d'affecter un middleware, mais ils font tous la même chose.

Route::get('/admin', 'AdminController@index')->middleware('auth', 'admin');
Route::get('admin/profile', ['using' => 'AdminController@index', 'middleware' => 'auth']);
Route::get('admin/profile', ['using' => 'AdminController@index', 'middleware' => ['auth', 'admin']);

Dans tous les exemples ci-dessus, vous pouvez également passer des noms de classe complets en tant que middleware, même s'il a été enregistré en tant que middleware de routage.

use App\Http\Middleware\CheckAdmin;
Route::get('/admin', 'AdminController@index')->middleware(CheckAdmin::class);


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow