如何设置Laravel中间件的执行顺序?在 中设置中间件优先级App\Http\Kernel

2022-08-30 17:09:39

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

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

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

我在Laravel github存储库中发现了类似问题的错误报告。然而,一位合作者关闭了这个问题,指出“这是预期的行为”。

我认为应该是应用程序外部的“层”,而函数是应用程序的一部分。middleware__construct

为什么函数在中间件之前执行(假设它是在中间件运行之前声明的)?为什么这是意料之中的?__construct


答案 1

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

如果它与中间件之间的顺序有关,则它自己

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


答案 2

在 中设置中间件优先级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,
];

推荐