Ritorniamo con le nostra super guide Laravel! Oggi si parla di Middleware. Cosa sono i Middleware? “I Middleware sono un meccanismo che serve a filtrare programmaticamente le richieste HTTP che riceve la vostra applicazione.”

State già usando i middleware di Laravel?

Laravel include un Middleware di default che verifica se l’utente è autenticato. Se non lo è, il Middleware reindirizzerà il visitatore alla schermata Login. Se l’utente invece lo è, alla richiesta, gli sarà permesso di continuare l’esecuzione come per intenzione.

Middleware Esempi di altri usi

Un Middleware può essere usato per verificare la chiave API inclusa in una richiesta oppure per limitare il numero di richieste per secondo alla vostra applicazione, cambiare la lingua del sito,
abilitare modalità ‘under maintenance’, eccetera.

Andremo a vedere come creare, registrare ed usare i Middleware nel nostro progetto.

Creeremo un Middleware per mettere in ‘Manutenzione’ certe url o l’intero progetto.

Middleware e Artisan

Per creare un Middleware possiamo usare Artisan 

Approfondimento Artisan

php artisan make:middleware Manutenzione

Il contenuto del nuovo Middleware verrà piazzato in:

app/Http/Middleware/Manutenzione.php

<?php
namespace App\Http\Middleware; use Closure;
class Manutenzione {
/**
* Handle an incoming request. */
public function handle($request, Closure $next) {
return $next($request); }
}

Noi vogliamo bloccare la richiesta. Dunque un’opzione sarebbe creare

una HttpException con codice 503.

Questo ci garantisce che Laravel restituirà la view resources/views/errors/503.blade.php

<?php
namespace App\Http\Middleware;
use Symfony\Component\HttpKernel\Exception\HttpException; // <---- importiamo la classe
use Closure;
class Manutenzione {
/**
* Handle an incoming request. */
public function handle($request, Closure $next) {
throw new HttpException(503); // <----- Exception 503 }
}

Adesso che il Middleware è stato configurato, dobbiamo far sapere all’applicazione che il Middleware esiste.

Tale processo avviene in app/Http/Kernel.php,

Se vogliamo eseguire sempre il Middlware, lo dobbiamo piazzare nell’array $middleware del Kernel

protected $middleware = [ ...
\App\Http\Middleware\Manutenzione::class ];

In questo caso l’utente vedrà sempre il messaggio di manutenzione.

Se vogliamo eseguire selettivamente il Middleware e attivarlo solo per certe routes, lo dobbiamo inserire nell’array $routeMiddleware del Kernel, con nome e path FQDN della classe.

protected $routeMiddleware = [ ...
'manutenzione' => \App\Http\Middleware\Manutenzione::class,
... ];

Prendiamo l’esempio del post

Route::get('posts/{post}', 'PostController@show');

Adesso per allacciare un Middleware a questa route in particolare

Route::get('posts/{post}', 'PostController@show')->middleware('manutenzione');

Per allacciare più Middleware ad una route

Route::get('posts/{post}', 'PostController@show') ->middleware(['manutenzione', 'auth', 'logger-richieste']);

Per allacciare più Middleware ad un gruppo di routes

Route::group(['middleware' => ['manutenzione']], function () {
Route::get('posts/{post}', 'PostController@show');
Route::get('posts/{post}/modifica', 'PostController@edit'); });

E se non volessimo usarle nel file delle routes bensì nel controller invece per un controllo più granulare?

<?php
namespace App\Http\Controllers; use App\Post;
use Illuminate\Http\Request;
class PostsController extends Controller
{
function __construct() {
$this->middleware('manutenzione'); }

Solo su certe routes

$this->middleware('manutenzione')->only('create', 'store', 'destroy');

A tutte le routes, eccetto alcune

$this->middleware('manutenzione')->except('index', 'edit', 'update');

A questo punto, se la guida ti è piaciuta e se pensi che possa essere opportuno per te procedere nello studio approfondito di Laravel, condividi sul tuo profilo Facebook questa guida e richiedi maggiori informazioni a amministrazione@laramind.com

Approfondimento: Le Routes con Laravel