13.x e all’implementazione del Framework v13.36.0. Per scrivere i middleware ordinari, consulta Middleware.
Separare registrazione, applicazione ed esecuzione
Router::aliasMiddleware() registra nell’array del Router l’alias come chiave e il nome della classe come valore. Non crea istanze del middleware né lo applica alle route.
Il nome dell’alias è un’API pubblica. Evita i nomi predefiniti come
auth o throttle e i nomi generici che possono entrare in conflitto con altri pacchetti, e aggiungi un prefisso specifico del pacchetto. Se registri di nuovo la stessa chiave, aliasMiddleware() sovrascrive la corrispondenza precedente.
Esporre l’alias dal provider
Nell’esempio seguente creiamo un middleware che aggiunge alla risposta un header identificativo fisso. Non si tratta di un esempio di autenticazione, autorizzazione o controllo degli accessi. Si presuppone che il PSR-4 di Composer associAcme\Courier\ a src/ e che il provider sia registrato tramite rilevamento automatico o manualmente.
src/Http/Middleware/AddCourierHeader.php
boot(). Gli argomenti di boot() vengono iniettati dal service container, quindi per registrare il middleware non è necessario modificare automaticamente il bootstrap/app.php dell’utente.
src/CourierServiceProvider.php
L’utente lo applica per singola route
Nel fileroutes/web.php dell’applicazione che utilizza il pacchetto, assegna il middleware solo alle route che ne hanno bisogno.
routes/web.php
->middleware(AddCourierHeader::class). Scegli in base alla necessità di offrire agli utenti un nome breve.
Anche quando è il pacchetto stesso a fornire le route, indica esplicitamente nel file delle route i middleware necessari. loadRoutesFrom() non aggiunge automaticamente web o api. Per il metodo di registrazione e la gestione della cache delle route, consulta Registrazione e cache delle route dei pacchetti.
L’applicazione all’intera applicazione è una scelta dell’utente
Per applicare il middleware a tutte le routeweb dell’applicazione, l’utente aggiunge la configurazione seguente alla callback withMiddleware() esistente. Non si tratta di un esempio che sostituisce la configurazione esistente.
web, non lo stack globale. Il middleware non viene applicato automaticamente ad api né alle route prive di entrambi i gruppi.
Le operazioni sui gruppi del Router si comportano in modo diverso
Se il pacchetto fornisce un proprio gruppo, usa un nome specifico. L’esempio seguente va inserito nelboot(Router $router) del provider.
->middleware('acme-courier'). Tuttavia, questo gruppo contiene solo le classi indicate e non eredita le sessioni né la protezione CSRF di web.
Esistono anche API per aggiungere elementi a gruppi esistenti, ma nell’implementazione del Router v13.36.0 presentano le differenze seguenti.
Se imposti solo la classe del pacchetto con
middlewareGroup('web', [...]), sostituisci il contenuto esistente di web. Non confonderlo con i metodi di aggiunta. Inoltre, eseguire pushMiddlewareToGroup() su un gruppo web inesistente non ripristina il gruppo web predefinito.
Il controllo dei duplicati dei metodi di aggiunta si basa sui valori registrati. Un alias e un nome di classe che puntano alla stessa classe sono stringhe diverse, quindi nella tabella di registrazione risultano elementi distinti. Uniforma la notazione e non dare per scontato che, al momento della registrazione, vengano eliminati i duplicati della stessa classe scritta in modi diversi.
Non affidarti al solo ordine di registrazione per garantire l’ordine di esecuzione
Il Router espande gli alias e i gruppi dei middleware assegnati alla route, gestisce le esclusioni e poi ordina in base alla priorità. La sola aggiunta in testa o in coda non garantisce un ordine rigoroso rispetto all’autenticazione o al route model binding. Inoltre,syncMiddlewareToRouter() dell’HTTP Kernel sincronizza nel Router i gruppi del Kernel tramite middlewareGroup(). Se la configurazione del Kernel viene risincronizzata in seguito, il contenuto dei gruppi aggiunto direttamente al Router può essere sostituito. Invece di competere sulla modifica dei gruppi esistenti in base all’ordine di avvio dei pacchetti, adotta come regola di base la centralizzazione della configurazione nel withMiddleware() dell’applicazione che utilizza il pacchetto.
Per le funzionalità che richiedono un ordine preciso, ad esempio dopo l’avvio della sessione o dopo l’autenticazione, indica chiaramente questo presupposto nelle istruzioni di installazione e verificalo insieme alla configurazione delle priorità dell’applicazione. Evita che il pacchetto sostituisca per intero l’elenco delle priorità dell’applicazione.
Confini tra cache e verifica
Non inserire la registrazione degli alias all’interno della condizioneroutesAreCached() o nel file delle route. Quando esiste la cache, loadRoutesFrom() non carica il file delle route, ma la registrazione resta necessaria per risolvere in fase di esecuzione gli alias presenti nelle route in cache. Registrali ogni volta nel boot() del provider.
Se modifichi l’assegnazione alle route, ricrea la cache delle route nell’applicazione che utilizza il pacchetto.
-vv serve a espandere e verificare il contenuto dei gruppi. Tuttavia, la riuscita della visualizzazione dell’elenco non garantisce il funzionamento della logica interna al middleware né l’uso della sessione. Servono anche test delle richieste HTTP.
Quello che segue è un metodo da aggiungere al Feature test di un’applicazione Laravel che definisce la route /courier-status vista sopra.
I test unitari che controllano l’esistenza dei gruppi o l’array degli alias e l’esecuzione HTTP reale sono verifiche distinte. In particolare, la verifica della cache non va fatta solo osservando il Router dello stesso processo, ma con un nuovo avvio dopo la creazione della cache. Se usi worker di lunga durata, ricaricali seguendo la normale procedura di deploy.
Pagine correlate
Middleware
Ripassa le basi di creazione, applicazione alle route, parametri e priorità.
Registrazione e cache delle route dei pacchetti
Approfondisce il rapporto tra il caricamento delle route e la configurazione al momento della creazione della cache.