2015-06-26 19 views
14

Il Laravel 5 documentation descrive due modi di assegnazione Middleware:Esecuzione Ordine di Middleware in laravel 5

  1. middleware Assegnare al percorso del controller.
  2. Specifica il middleware all'interno del costruttore del controller.

Tuttavia, mi sono reso conto che il codice scritto nei controllori __construct() funzione verrà eseguito prima della Middleware, anche se il Middleware è dichiarato sulla prima riga della funzione __construct del controller.

Ho trovato uno bug report per un problema simile nel repository github di Laravel. Tuttavia un collaboratore ha chiuso il problema affermando "Questo è il comportamento previsto".

Mi chiedo che, middleware debba essere "layer" all'esterno dell'applicazione, mentre la funzione __construct fa parte dell'applicazione. Perché la funzione __construct viene eseguita prima del middleware (dato che si tratta di un middleware precedente) e perché questo è previsto?

+1

Ho appena fatto alcune prove per confermare. Se si desidera eseguire il middleware prima dei controller '__construct()' è necessario assegnare il middleware alla route. Altrimenti sarà sempre eseguito alla fine di '__construct()' anche se assegnato sulla prima riga di 'construct()'. – Jeemusu

+0

Ho creato un breve esempio per delineare ciò che stai descrivendo, sentiti libero di aggiungerlo alla tua domanda. https://www.notehub.org/2015/6/26/say-we-have-a-controller----welcomecontr – Jeemusu

+0

@Jeemusu Grazie per il tuo commento.Sì, ho anche scoperto questa differenza tra i due modi di assegnare il middleware. Tuttavia, posizionando il middleware alla fine del flusso di esecuzione nel costruttore, è contro il Ciclo di vita della richiesta (http://laravel.com/docs/5.1/lifecycle), poiché la richiesta di spedizione dovrebbe essere alla fine? –

risposta

7

La logica dell'applicazione risiede nei metodi del controller. Quindi, fondamentalmente l'applicazione vive nei metodi del controller, non nell'intero controller stesso.

Il middleware viene eseguito PRIMA che la richiesta entri nel rispettivo metodo di controllo. E quindi, questo è sempre FUORI dalla vera applicazione. Nessun metodo di controllo viene eseguito a meno che tutti i Middlewares non stiano passando la richiesta.

Le dichiarazioni $this->middleware("My\Middleware"); inserite nel costruttore del controller, REGISTRANO My\Middleware per il controllo prima che la richiesta entri nell'applicazione.

Se viene visualizzato il codice di un middleware e se la richiesta è passata, la inviamo al middleware successivo utilizzando l'istruzione $next($request);. Ciò consente l'esecuzione di più middleware per una singola richiesta. Ora, se Laravel eseguisse il middleware proprio nell'istruzione $this->middleware(...);, probabilmente Laravel non sarebbe in grado di sapere quale middleware dovrebbe essere controllato successivamente.

Quindi, Laravel risolve questo registrando prima tutti i middleware, quindi passando la richiesta attraverso tutti i middleware uno per uno.

+2

un caso interessante con questo in cui il middleware viene eseguito rispetto al costruttore. Qualsiasi middleware globale sembra funzionare * prima * del costruttore, mentre qualsiasi middleware locale viene eseguito dopo il costruttore. Questa incoerenza mi ha causato confusione e problemi in passato. –

+0

quindi ciò che viene eseguito per primo causa la risposta non chiara per me mi aspetto che sia il seguente ** percorso di gruppo ** => ** percorso specificato ** (per ordine di matrice) quindi 'costrutto di controllo '. è vero? –

+0

Anch'io sono ancora confuso su come laravel decida quale ordine eseguirli. È alfabetico? – JohnL

1

Un'altra risposta per coprire un altro caso d'uso a quella domanda

Se è legato alla fine tra il middleware è di per sé

È possibile aggiornare il $ middlewarePriority nella vostra App \ Kernel.