Articoli

Laravel middleware come funziona

Il middleware di Laravel è un livello applicativo intermedio che interviene tra la richiesta dell’utente e la risposta dell’applicativo.

Questo vuol dire che quando l’utente (view di Laravel) fa una richiesta al server (controller di Laravel), la richiesta passerà attraverso il middleware. In questo modo il middleware può verificare se la richiesta è autenticata o meno: 

  • se la richiesta dell’utente è autenticata, la richiesta viene inviata al back-end;
  • se la richiesta dell’utente non è autenticata, il middleware reindirizzerà l’utente alla schermata di login.

Laravel consente di definire e utilizzare middleware aggiuntivi per eseguire una serie di attività ad eccezione dell’autenticazione. 

I middleware di Laravel, come l’autenticazione e la protezione CSRF, si trovano nella directory app/Http/Middleware .

Possiamo quindi dire che il middleware è un filtro di richiesta http, mediante il quale è possibile verificare delle condizioni e fare delle azioni.

Creazione del middleware

Per creare un nuovo middleware eseguiamo il comando seguente:

php artisan make:middleware <name-of-middleware>

Creiamo il middleware e lo chiamiamo CheckAge, artisan ci risponderà come segue:

La finestra sopra mostra che il middleware è stato creato con successo con il nome ” CheckAge “.

Per vedere se il middleware CheckAge è stato creato o meno, vai nel progetto nel folder app/Http/Middleware, e vedrai il file appena creato

Il file appena creato ha il seguente codice

<?php

namespace App\Http\Middleware;

use Closure;

class CheckAge
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        return $next($request);
    }
}

Usare un middleware

Per usare un middleware, abbiamo bisogno di registrarlo.

Esistono due tipi di middleware in Laravel:

  • Middleware globale
  • Route Middleware

Il Global Middleware verrà eseguito su ogni richiesta HTTP dell’applicazione, mentre il Route Middleware verrà assegnato a un percorso specifico. Il middleware può essere registrato su app/Http/Kernel.php. Questo file contiene due proprietà $middleware e $routeMiddleware . La proprietà $middleware viene utilizzata per registrare il middleware globale e la proprietà $routeMiddleware viene utilizzata per registrare il middleware specifico della route.

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

protected $middleware = [
        \App\Http\Middleware\TrustProxies::class,
        \App\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    ];

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

protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
    ];

Abbiamo creato CheckAge nell’esempio precedente. Ora possiamo registrarlo nella proprietà route middleware. Il codice per tale registrazione è mostrato di seguito.

protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
        'Age' => \App\Http\Middleware\CheckAge::class,
    ];

Parametri del middleware

Possiamo anche passare i 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, puoi farlo passando i parametri con il middleware. 

Il middleware che abbiamo creato contiene la seguente funzione, e possiamo passare argomenti personalizzati dopo l’argomento $next .

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

Ora proviamo a impostare il parametro ruolo a un nuovo middleware che andiamo a creare ex-novo, quindi procediamo a creare Role Middleware eseguendo il seguente comando

Modificare il metodo handle nel modo seguente

Articoli correlati
<?php

namespace App\Http\Middleware;
use Closure;

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

abbiamo aggiunto il parametro $role, e all’interno del metodo la riga echo per scrivere il output il nome del ruolo.

Newsletter sull’Innovazione
Non perderti le notizie più importanti sull'Innovazione. Iscriviti per riceverle via e-mail.

Registriamo ora il middleware RoleMiddleware per uno specifico percorso

protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
        'Age' => \App\Http\Middleware\CheckAge::class,
        'Role' => \App\Http\Middleware\RoleMiddleware::class,
    ];

Ora per provare il middleware con il parametro, abbiamo la necessità di creare una richiesta e una risposta. Per simulare la risposta andiamo a creare il controller che chiameremo TestController

php artisan make:controller TestController --plain

il comando appena eseguito andrà a creare un nuovo controller all’interno del folder app/Http/TestController.php, e modifica il metodo index con la riga echo "<br>Test Controller.";

<?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.";
   }
}

Dopo aver impostato la risposta, costruiamo la richiesta modificando il file routes.php, aggiungendo la route role

Route::get('role',[
   'middleware' => 'Role:editor',
   'uses' => 'TestController@index',
]);

a questo punto possiamo provare l’esempio andando a visitare l’URL http://localhost:8000/role

e nel browser vedremo i due echo

Role editor
Test Controller

Terminable Middleware

Il terminable Middleware esegue alcune attività dopo che la risposta è stata inviata al browser. Ciò può essere ottenuto creando un middleware con il metodo terminate nel middleware. Il terminable Middleware deve essere registrato con il middleware globale. Il metodo terminate riceverà due argomenti $request e $response. 

Il metodo Terminate deve essere creato come mostrato nel codice seguente.

php artisan make:middleware TerminateMiddleware

Una volta creato il middleware app/Http/Middleware/TerminateMiddleware.php modifichiamone il codice nel modo seguente

<?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.";
   }
}

in questo caso abbiamo un metodo handle e un metodo terminate con i due parametri $request e $response.

Ora registriamo il Middleware

protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
        'Age' => \App\Http\Middleware\CheckAge::class,
        'Role' => \App\Http\Middleware\RoleMiddleware::class,
        'terminate' => \App\Http\Middleware\TerminateMiddleware::class,
    ];

Ora dobbiamo creare il controller per simulare la risposta

php artisan make:controller XYZController --plain

modificandone il contenuto della classe

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

Ora dobbiamo modificare il file routes/web.php aggiungendo le rotte che servono per attivare la richiesta

Route::get('terminate',[
   'middleware' => 'terminate',
   'uses' => 'XYZController@index',
]);

a questo punto possiamo provare l’esempio andando a visitare l’URL http://localhost:8000/terminate

e nel browser vedremo le seguenti righe

Executing statements of handle method of TerminateMiddleware
XYZController
Executing statements of terminate method of TerminateMiddleware

Ercole Palmeri

Potrebbe interessarti anche:

Newsletter sull’Innovazione
Non perderti le notizie più importanti sull'Innovazione. Iscriviti per riceverle via e-mail.

Articoli recenti

Nasce Nim, l’Osservatorio del Nord-Est sull’economia dell’innovazione

Nasce l’Osservatorio del Nordest sull’economia dell’Innovazione Nim, (Numbers Innovation Motion) è un progetto di Galileo Visionary District realizzato in collaborazione…

7 Dicembre 2023

Innovazione del Content Marketing con Memory e Personality

ASKtoAI lancia le innovative funzionalità Memory e Personality, strumenti d'avanguardia per la creazione di contenuti digitali che promettono di migliorare…

6 Dicembre 2023

Discuss apre una nuova era di ricerca qualitativa con GenAI ampliata e innovazione asincrona

Discuss , la piattaforma leader appositamente creata per trasformare le esperienze in insight, ha potenziato le sue capacità di scalare la…

6 Dicembre 2023

Unwrapping Innovation: Blue Lake Packaging annuncia un’alternativa a base di fibra e priva di plastica al nastro e ai dispenser tradizionali

Con le festività che si avvicinano rapidamente, Blue Lake Packaging è entusiasta di offrire un'alternativa ecologica al nastro da imballaggio…

6 Dicembre 2023

Riepilogo del Netlogistik Innovation Day: trasformazione digitale della catena del freddo, innovazioni nel riciclaggio e leadership nella supply chain

Netlogistik , leader in potenti servizi che guidano le aziende verso la trasformazione digitale della catena di fornitura, ha recentemente tenuto…

6 Dicembre 2023

Lattice collabora con NVIDIA per accelerare l’IA edge

Annuncia una soluzione integrata che combina FPGA di Lattice a bassa potenza e bassa latenza con la piattaforma NVIDIA Orin…

6 Dicembre 2023

Evoluzione del tessile: il progetto TEPP della Taiwan Textile Federation ispira l’innovazione sostenibile oltre il 2023

Con un successo clamoroso, il Textile Export Promotion Project (TEPP), guidato dalla Taiwan Textile Federation nel 2023, ha messo in…

5 Dicembre 2023

Lattice continua la rapida espansione del portafoglio di prodotti che rende possibile la prossima era dell’innovazione

Lattice presenta i nuovi FPGA mid-range Lattice Avant-G e Lattice Avant-X, stack di soluzioni specifiche per le applicazioni ampliate e…

5 Dicembre 2023

Scopri di più sulla gestione della conoscenza e sull’innovazione per gli studi legali con un nuovo trattato scritto da esperti

Innovazione per i professionisti della gestione della conoscenza e dell'innovazione (KM&I). Nel settore legale è ora disponibile un riferimento completo…

5 Dicembre 2023

La Fondazione Eclipse lancia il gruppo di lavoro Eclipse Dataspace per promuovere l’innovazione globale nella condivisione affidabile dei dati

La Eclipse Foundation , una delle più grandi fondazioni di software open source al mondo, ha annunciato oggi la formazione dell'Eclipse…

5 Dicembre 2023