web-dev-qa-db-fra.com

Ordre d'exécution du middleware en Laravel 5

La documentation Laravel 5 décrit deux manières d'affecter Middleware :

  1. Affectez un middleware à la route du contrôleur.
  2. Spécifiez le middleware dans le constructeur de votre contrôleur.

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?

17
Samuel Shen

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.

9
Curos

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.

3
Bdwey

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

2
Raheel Hasan