Laravel - Middleware

Il middleware funge da ponte tra una richiesta e una risposta. È un tipo di meccanismo di filtraggio. Questo capitolo spiega il meccanismo del middleware in Laravel.

Laravel include un middleware che verifica se l'utente dell'applicazione è autenticato o meno. Se l'utente è autenticato, reindirizza alla home page altrimenti, in caso contrario, reindirizza alla pagina di accesso.

Il middleware può essere creato eseguendo il seguente comando:

php artisan make:middleware <middleware-name>

Sostituisci il <middleware-name>con il nome del tuo middleware. Il middleware che crei può essere visto inapp/Http/Middleware directory.

Esempio

Osservare il seguente esempio per comprendere il meccanismo del middleware:

Step 1- Creiamo ora AgeMiddleware. Per crearlo, dobbiamo eseguire il seguente comando:

php artisan make:middleware AgeMiddleware

Step 2 - Dopo aver eseguito con successo il comando, riceverai il seguente output -

Step 3 - AgeMiddleware sarà creato a app/Http/Middleware. Il file appena creato avrà il seguente codice già creato per te.

<?php

namespace App\Http\Middleware;
use Closure;

class AgeMiddleware {
   public function handle($request, Closure $next) {
      return $next($request);
   }
}

Registrazione del middleware

Dobbiamo registrare ogni middleware prima di utilizzarlo. Esistono due tipi di middleware in Laravel.

  • Middleware globale
  • Middleware di route

Il Global Middleware verrà eseguito su ogni richiesta HTTP dell'applicazione, mentre il Route Middlewareverrà assegnato a un percorso specifico. Il middleware può essere registrato inapp/Http/Kernel.php. Questo file contiene due proprietà $middleware e $routeMiddleware. $middleware viene utilizzata per registrare Global Middleware e $routeMiddleware viene utilizzata per registrare il middleware specifico del percorso.

Per registrare il middleware globale, elenca la classe alla fine della proprietà $ middleware.

protected $middleware = [
   \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
   \App\Http\Middleware\EncryptCookies::class,
   \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
   \Illuminate\Session\Middleware\StartSession::class,
   \Illuminate\View\Middleware\ShareErrorsFromSession::class,
   \App\Http\Middleware\VerifyCsrfToken::class,
];

Per registrare il middleware specifico del percorso, aggiungi la chiave e il valore alla proprietà $ routeMiddleware.

protected $routeMiddleware = [
   'auth' => \App\Http\Middleware\Authenticate::class,
   'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
   'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
];

Esempio

Abbiamo creato AgeMiddlewarenell'esempio precedente. È ora possibile registrarlo nella proprietà middleware specifica del percorso. Il codice per tale registrazione è mostrato di seguito.

Quello che segue è il codice per app/Http/Kernel.php -

<?php

namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel {
   protected $middleware = [
      \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
      \App\Http\Middleware\EncryptCookies::class,
      \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
      \Illuminate\Session\Middleware\StartSession::class,
      \Illuminate\View\Middleware\ShareErrorsFromSession::class,
      \App\Http\Middleware\VerifyCsrfToken::class,
   ];
  
   protected $routeMiddleware = [
      'auth' => \App\Http\Middleware\Authenticate::class,
      'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
      'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
      'Age' => \App\Http\Middleware\AgeMiddleware::class,
   ];
}

Parametri middleware

Possiamo anche passare parametri con il middleware. Ad esempio, se la tua applicazione ha ruoli diversi come utente, amministratore, super amministratore ecc. E desideri autenticare l'azione in base al ruolo, ciò può essere ottenuto passando i parametri con il middleware. Il middleware che creiamo contiene la seguente funzione e possiamo passare il nostro argomento personalizzato dopo$next discussione.

public function handle($request, Closure $next) {
   return $next($request);
}

Esempio

Step 1 - Crea RoleMiddleware eseguendo il seguente comando -

php artisan make:middleware RoleMiddleware

Step 2 - Dopo aver eseguito con successo, riceverai il seguente output -

Step 3 - Aggiungere il codice seguente nel metodo handle del nuovo RoleMiddlewareat app/Http/Middleware/RoleMiddleware.php.

<?php

namespace App\Http\Middleware;
use Closure;

class RoleMiddleware {
   public function handle($request, Closure $next, $role) {
      echo "Role: ".$role;
      return $next($request);
   }
}

Step 4 - Registra il RoleMiddleware in app\Http\Kernel.phpfile. Aggiungi la linea evidenziata in grigio in quel file per registrare RoleMiddleware.

Step 5 - Esegui il seguente comando per creare TestController -

php artisan make:controller TestController --plain

Step 6 - Dopo aver eseguito con successo il passaggio precedente, riceverai il seguente output:

Step 7 - Copia le seguenti righe di codice in app/Http/TestController.php file.

app/Http/TestController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class TestController extends Controller {
   public function index() {
      echo "<br>Test Controller.";
   }
}

Step 8 - Aggiungi la seguente riga di codice in app/Http/routes.php file.

app/Http/routes.php

Route::get('role',[
   'middleware' => 'Role:editor',
   'uses' => '[email protected]',
]);

Step 9 - Visita il seguente URL per testare il middleware con i parametri

http://localhost:8000/role

Step 10 - L'output apparirà come mostrato nell'immagine seguente.

Middleware terminabile

Il middleware terminabile esegue alcune attività dopo che la risposta è stata inviata al browser. Ciò può essere ottenuto creando un middleware conterminatemetodo nel middleware. Il middleware terminabile deve essere registrato con il middleware globale. Il metodo terminate riceverà due argomenti$request e $response. Il metodo Terminate può essere creato come mostrato nel codice seguente.

Esempio

Step 1 - Crea TerminateMiddleware eseguendo il comando seguente.

php artisan make:middleware TerminateMiddleware

Step 2 - Il passaggio precedente produrrà il seguente output:

Step 3 - Copia il seguente codice nel file TerminateMiddleware a app/Http/Middleware/TerminateMiddleware.php.

<?php

namespace App\Http\Middleware;
use Closure;

class TerminateMiddleware {
   public function handle($request, Closure $next) {
      echo "Executing statements of handle method of TerminateMiddleware.";
      return $next($request);
   }
   
   public function terminate($request, $response) {
      echo "<br>Executing statements of terminate method of TerminateMiddleware.";
   }
}

Step 4 - Registra il file TerminateMiddleware in app\Http\Kernel.phpfile. Aggiungi la linea evidenziata in grigio in quel file per registrare TerminateMiddleware.

Step 5 - Esegui il seguente comando per creare ABCController.

php artisan make:controller ABCController --plain

Step 6 - Dopo la corretta esecuzione dell'URL, riceverai il seguente output -

Step 7 - Copia il seguente codice in app/Http/ABCController.php file.

app/Http/ABCController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class ABCController extends Controller {
   public function index() {
      echo "<br>ABC Controller.";
   }
}

Step 8 - Aggiungi la seguente riga di codice in app/Http/routes.php file.

app/Http/routes.php

Route::get('terminate',[
   'middleware' => 'terminate',
   'uses' => '[email protected]',
]);

Step 9 - Visita il seguente URL per testare il middleware terminabile.

http://localhost:8000/terminate

Step 10 - L'output apparirà come mostrato nell'immagine seguente.