Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

I middleware in un'applicazione basata su Laravel

Come funzionano i middleware in un'applicazione Web realizzata con Laravel e come utilizzare queste componenti che fungono da filtri per le chiamate HTTP.
Come funzionano i middleware in un'applicazione Web realizzata con Laravel e come utilizzare queste componenti che fungono da filtri per le chiamate HTTP.
Link copiato negli appunti

I middleware rappresentano dei componenti della applicazione Web che fungono da filtri per le chiamate HTTP in entrata. Possono essere usati per esempio per gestire l'autenticazione, ridirigendo l'utente ad una pagina di errore nel caso cercasse di accedere ad una risorsa privata, o per creare un sistema di logging integrato autonomo dai diversi controller.
Laravel viene fornito con già un proprio set di middleware, ma è ovviamente possibile definirne di propri.

Per creare un nuovo middleware, Laravel propone un apposito comando artisan:

php artisan make:middleware MyBrandNewMiddleware

I middleware, all'interno della struttura di cartelle di Laravel, vengono salvati in app/Http/Middleware.

Il miglior modo per comprendere il meccanismo dei middleware è quello di immaginarli come dei diversi layer che vengono invocati in serie prima dello scatenamento del metodo del controller. In un qualsiasi punto di questi layer sarà possibile bloccare l'esecuzione standard o continuare con il flusso normale. Ciascun middleware deve implementare il metodo handle($request, Closure $next). All'interno di questo metodo sarà nostro onere quello di effettuare la logica di business desiderata prima di invocare la closure $next che equivale a continuare la catena di layers normalmente.

Tramite i middleware è possibile intervenire sia prima che dopo l'invocazione del controller specifico. In base al momento in cui intervengono, i middleware prendono rispettivamente i nomi di before middleware e after middleware. Ecco due esempi:

class BeforeMiddleware
{
    public function handle($request, Closure $next)
    {
        // eseguo il codice custom del middleware
        return $next($request);
    }
}
class AfterMiddleware
{
    public function handle($request, Closure $next)
    {
        $response = $next($request);
        // eseguo il codice custom del middleware ($response conterrà  il corpo della risposta)
        return $response;
    }
}

Registrare i middleware

In base al contesto di utilizzo, possono esistere due diverse tipologie di middleware: i middleware globali e i middleware route-based. Nel primo caso si tratta di middleware che scattano per ogni chiamata HTTP verso l'applicazione, nel secondo caso è invece possibile filtrare la loro esecuzione in base alla rotta corrente.

Per registrare dei middleware globali è necessario aggiungere il riferimento alla nostra classe middleware all'interno del file app/Http/kernel.php. Per registrare invece dei middleware basati sulle route è necessario prima registrarli ed assegnargli un nome (sempre all'interno di app/Http/Kernel.php) e successivamente utilizzare il loro nome all'interno della definizione delle rotte impiegando, per esempio, questa sintassi:

Route::get('/route/123', ['middleware' => 'auth', function() {
    //
}]);

Nel caso fosse necessario, i middleware possono essere assegnati anche utilizzando dei gruppi di rotte:

Route::group(['middleware' => 'auth'], function () {
    Route::get('/route/123', function() {
    });
    [....]
});

Nell'ottica della non duplicazione del codice, è possibile definire middleware astratti e che possono modificare il loro comportamento in base a parametri definibili all'esterno del middleware stesso. Per implementare questa funzionalità è necessario inserire eventuali nuovi parametri nella definizione del metodo handle() e, nel momento della registrazione, impostare questi nuovi parametri.

Supponendo di dover creare un middleware che comunichi via mail eventuali accessi all'applicazione, potremmo scrivere:

class EmailNotifierMiddleware
{
    public function handle($request, Closure $next, $recipient)
    {
        //invio mail a $recipient
        return $next($request);
    }
}
Route::get('/rotta/123', ['middleware' => 'emailnotifier:mail123@domain.it', function ($id) {
    //
}]);
Route::get('/rotta/456', ['middleware' => 'emailnotifier:mail345@domain.it', function ($id) {
    //
}]);

Ti consigliamo anche