如何设置Laravel中间件的执行顺序


How to set the Laravel middleware order of execution?

Laravel 5文档描述了两种分配中间件的方法

  1. 将中间件分配给控制器的路由
  2. 在控制器的构造函数中指定中间件

然而,我意识到,在控制器__construct()函数中编写的任何代码都将在中间件之前运行,即使Middleware是在控制器的__construct函数的第一行声明的。

我在Laravel-github存储库中发现了一个类似问题的错误报告。然而,一位合作者结束了这一问题,并表示"这是预期的行为"

我认为middleware应该是应用程序之外的"层",而__construct函数是应用程序的一部分。

为什么__construct函数在中间件之前执行(假设它是在中间件运行之前声明的)?为什么会出现这种情况?

另一个答案,涵盖该问题的另一个用例

如果它与中间件之间的订单有关,它自己

您可以在App''Kernel中更新$middlewarePriority。

App'Http'Kernel中设置中间件优先级

例如,在这里,我需要我的自定义身份验证中间件首先运行(在替换绑定之前),所以我将其卸载到堆栈上:

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);
}

或者,如果您需要明确的控制,您可以覆盖整个优先级结构(不建议这样做,因为在升级过程中您必须更加关注框架是否发生了变化)。特定于这个问题的是处理路由模型绑定的SubstituteBindings类,所以只需确保您的身份验证中间件在此之前的某个时间出现。

/**
 * 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,
];

应用程序逻辑驻留在控制器的方法中。因此,基本上应用程序存在于控制器的方法中,而不是整个控制器本身。

中间件在请求进入相应的控制器方法之前运行。因此,这总是在实际应用程序之外。除非所有中间件都在传递请求,否则不会执行任何控制器方法。

您放入控制器构造函数中的$this->middleware("My'Middleware");语句REGISTER My'Middleware,以便在请求进入应用程序之前进行检查。

如果您看到中间件的代码如果请求正在传递,那么我们使用$next($request);语句将其发送到下一个中间件。这允许针对单个请求执行多个中间件。现在,如果Laravel在$this->middleware(...);语句中运行中间件,那么Laravel可能无法知道下一步应该检查哪个中间件。

因此,Laravel通过首先注册所有中间件,然后逐个通过所有中间件传递请求来解决这个问题。

他们更新了middlewarescontroller和控制器构造之间的执行顺序。

以前是:

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

现在是:

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

点击此处阅读更多信息: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