styde que configurar php laravel laravel-5 laravel-middleware

php - que - middleware web laravel



¿Cómo configurar la orden de ejecución del middleware Laravel? (4)

La documentación de Laravel 5 describe dos formas de asignar Middleware :

  1. Asigna middleware a la ruta del controlador.
  2. Especifique middleware dentro del constructor de su controlador.

Sin embargo, me di cuenta de que cualquier código escrito en la función __construct() los controladores se ejecutará antes del Middleware , incluso si el Middleware se declara en la primera línea de la función __construct del controlador.

Encontré un informe de error para un problema similar en el repositorio de Github de Laravel. Sin embargo, un colaborador cerró el problema diciendo "Este es el comportamiento esperado".

Estoy pensando que el middleware debería ser "capas" fuera de la aplicación, mientras que la función __construct es parte de la aplicación.

¿Por qué se __construct función __construct antes del middleware (dado que se declara antes de que se ejecute el middleware)? ¿Y por qué se espera esto?


Establecer la prioridad de middleware en la App/Http/Kernel

Por ejemplo, aquí necesito que mi middleware de autenticación personalizado se ejecute primero (antes de sustituir los enlaces), así que lo cambio a la pila:

public function __construct(Application $app, Router $router) { /** * Because we are using a custom authentication middleware, * we want to ensure it''s executed early in the stack. */ array_unshift($this->middlewarePriority, MyCustomApiAuthMiddleware::class); parent::__construct($app, $router); }

Alternativamente, puede anular toda la estructura de prioridades si necesita un control explícito (no se recomienda porque tendrá que prestar más atención durante las actualizaciones para ver si el marco de trabajo cambia). Específico a este problema es la clase SubstituteBindings que maneja el enlace del modelo de ruta, así que asegúrate de que tu middleware de autenticación llegue antes.

/** * The priority-sorted list of middleware. * * Forces the listed middleware to always be in the given order. * * @var array */ protected $middlewarePriority = [ /App/Http/Middleware/MyCustomApiAuthMiddleware::class /Illuminate/Session/Middleware/StartSession::class, /Illuminate/View/Middleware/ShareErrorsFromSession::class, /Illuminate/Auth/Middleware/Authenticate::class, /Illuminate/Session/Middleware/AuthenticateSession::class, /Illuminate/Routing/Middleware/SubstituteBindings::class, /Illuminate/Auth/Middleware/Authorize::class, ];


La lógica de la aplicación reside en los métodos del controlador. Básicamente, la aplicación vive en los métodos del controlador, no en el controlador en sí.

El middleware se ejecuta ANTES de que la solicitud ingrese al método del controlador correspondiente. Y por lo tanto, esto siempre es FUERA de la aplicación real. No se ejecuta ningún método de controlador a menos que todos los Middlewares estén pasando la solicitud.

El $this->middleware("My/Middleware"); En las declaraciones que coloque en el constructor del controlador, REGISTRE My/Middleware para verificar antes de que la solicitud ingrese a la aplicación.

Si ve el código de un middleware y si la solicitud está pasando, entonces lo enviamos al siguiente middleware usando $next($request); declaración. Esto permite que se ejecuten múltiples middlewares para una sola solicitud. Ahora, si Laravel ejecuta el middleware justo en $this->middleware(...); En una declaración, Laravel probablemente no podría saber qué middleware se debe verificar a continuación.

Entonces, Laravel resuelve esto registrando todos los middlewares primero, luego pasando la solicitud a través de todos los middlewares uno por uno.


Otra respuesta para cubrir otro caso de uso a esa pregunta.

Si está relacionado con el orden entre middleware, se auto

Puede actualizar la $ middlewarePriority en su App / Kernel.


Se actualizó el orden de ejecución entre middlewares , controller y construcción del controlador.

Anteriormente era:

1. The global middleware pipeline 2. The route middleware pipeline 3. The controller middleware pipeline

Ahora es:

1. The global middleware pipeline 2. Controller''s Construct 3. The route & controller middlewares

Lea más aquí: https://laracasts.com/discuss/channels/general-discussion/execution-order-in-controllers-constructor-whit-middleware https://laravel-news.com/controller-construct-session-changes-in-laravel-5-3