La documentation Laravel 5 décrit deux manières d'affecter Middleware :
Cependant, j'ai réalisé que tout code écrit dans la fonction __construct()
du contrôleur s'exécutera avant le Middleware , même si le Middleware est déclaré sur la première ligne de la fonction __construct
du contrôleur.
J'ai trouvé un rapport de bogue pour un problème similaire dans le référentiel Laravel github. Toutefois, un collaborateur a résolu le problème en indiquant "Il s'agit du comportement attendu".
Je me demande si, middleware
devrait être "des couches" en dehors de l'application, alors que la fonction __construct
fait partie de l'application. Pourquoi la fonction __construct
est-elle exécutée avant le middleware (étant donné qu'il s'agit d'un avant le middleware) et pourquoi cela est-il attendu?
La logique de l'application réside dans les méthodes du contrôleur. Donc, fondamentalement, l’application réside dans les méthodes du contrôleur, pas dans l’ensemble du contrôleur.
Le middleware s'exécute AVANT que la demande entre la méthode de contrôleur correspondante. Et ainsi, cela est toujours en dehors de l'application réelle. Aucune méthode de contrôleur n'est exécutée à moins que tous les Middlewares passent la requête.
Les instructions $this->middleware("My\Middleware");
que vous avez insérées dans le constructeur du contrôleur, REGISTER le My\Middleware
à vérifier avant que la demande n'entre dans l'application.
Si vous voyez le code d'un middleware et Si la requête est transmise, nous l'envoyons au middleware suivant à l'aide de l'instruction $next($request);
. Cela permet à plusieurs middlewares d'être exécutés pour une seule requête. À présent, si Laravel exécutait le middleware à l'instruction $this->middleware(...);
, Laravel ne serait probablement pas en mesure de savoir quel middleware devait être vérifié ultérieurement.
Donc, Laravel résout ce problème en enregistrant d’abord tous les middlewares, puis en transmettant la requête à tous les middlewares un par un.
Une autre réponse pour couvrir un autre cas d'utilisation à cette question
Si c'est lié à l'ordre entre middleware c'est auto
Vous pouvez mettre à jour la $ middlewarePriority dans votre App\Kernel.
Ils ont mis à jour l'ordre d'exécution entre middlewares
, controller
et la construction du contrôleur.
Auparavant c'était:
1. The global middleware pipeline
2. The route middleware pipeline
3. The controller middleware pipeline
Maintenant c'est:
1. The global middleware pipeline
2. Controller's Construct
3. The route & controller middlewares
Lisez plus ici: https://laracasts.com/discuss/channels/general-discussion/execution-order-in-controllers-constructor-whit-middlewarehttps : //laravel-news.com/controller-construct-session-changes-in-laravel-5-3