Un middleware è un meccanismo per ispezionare e filtrare le richieste HTTP in arrivo.
Puoi inserire logica prima e dopo che la richiesta arrivi al controller.Ad esempio, Laravel include un middleware di autenticazione.
Se l’utente non è autenticato, effettua il redirect alla schermata di login; se lo è, lascia proseguire la richiesta all’interno dell’applicazione.Oltre all’autenticazione puoi creare middleware per registrazione dei log, protezione CSRF, rate limiting e altri scopi. Per i dettagli sulla protezione CSRF di Laravel 13 consulta Protezione CSRF.
I middleware definiti dall’utente si trovano di norma nella directory app/Http/Middleware.
Laravel prevede di default due gruppi di middleware: web e api.
A routes/web.php viene applicato automaticamente il gruppo web e a routes/api.php il gruppo api.
Gruppo di middleware web
EncryptCookies
AddQueuedCookiesToResponse
StartSession
ShareErrorsFromSession
PreventRequestForgery (protezione CSRF)
SubstituteBindings
I middleware più comuni hanno inoltre degli alias per essere richiamati con nomi brevi.
Crea un nuovo middleware con il comando Artisan make:middleware.
php artisan make:middleware EnsureTokenIsValid
Viene generato app/Http/Middleware/EnsureTokenIsValid.php.
Scrivi la logica di elaborazione della richiesta nel metodo handle.
<?phpnamespace App\Http\Middleware;use Closure;use Illuminate\Http\Request;use Symfony\Component\HttpFoundation\Response;class EnsureTokenIsValid{ /** * Gestisce la richiesta in arrivo * * @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next */ public function handle(Request $request, Closure $next): Response { if ($request->input('token') !== 'my-secret-token') { return redirect('/home'); } return $next($request); }}
Chiamando $next($request) la richiesta prosegue nell’elaborazione successiva.
Se la condizione non è soddisfatta, restituisci un redirect o una risposta per interrompere.
Il middleware può eseguire logica prima o dopo la richiesta.
// Elaborazione prima della richiestapublic function handle(Request $request, Closure $next): Response{ // Pre-elaborazione qui return $next($request);}
// Elaborazione dopo la rispostapublic function handle(Request $request, Closure $next): Response{ $response = $next($request); // Post-elaborazione qui return $response;}
Per applicare il middleware solo a certe route, chiama il metodo middleware nella definizione della route.
use App\Http\Middleware\EnsureTokenIsValid;Route::get('/profile', function () { // ...})->middleware(EnsureTokenIsValid::class);
Per più middleware passa un array.
Route::get('/', function () { // ...})->middleware([First::class, Second::class]);
Per escludere un middleware da una route specifica usa withoutMiddleware.
use App\Http\Middleware\EnsureTokenIsValid;Route::middleware([EnsureTokenIsValid::class])->group(function () { Route::get('/', function () { // A questa route si applica il middleware }); Route::get('/profile', function () { // Questa route esclude il middleware })->withoutMiddleware([EnsureTokenIsValid::class]);});
<?phpnamespace App\Http\Middleware;use Closure;use Illuminate\Http\Request;use Symfony\Component\HttpFoundation\Response;class RedirectIfNotAuthenticated{ public function handle(Request $request, Closure $next): Response { if (! $request->user()) { return redirect('/login'); } return $next($request); }}
Applicalo alla route.
Route::get('/dashboard', function () { return view('dashboard');})->middleware(RedirectIfNotAuthenticated::class);
Laravel include il middleware auth per l’autenticazione. Prima di implementarne uno personalizzato, verifica se puoi soddisfare i tuoi requisiti con i middleware esistenti.