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' => 'TestController@index',
]);
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' => 'ABCController@index',
]);
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.