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

  • 将中间件分配给 Controller 的路由。
  • 在 Controller 的构造函数中指定中间件。

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

    我在Laravel github存储库中找到了一个类似问题的bug report。但是,合作者关闭了该问题,并指出“这是预期的行为”。

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

    为什么在中间件之前执行__construct函数(假设在中间件运行之前声明了该函数)?为什么会这样呢?

    最佳答案

    应用程序逻辑驻留在 Controller 的方法中。因此,基本上,应用程序生活在 Controller 的方法中,而不是整个 Controller 本身。

    中间件在请求进入相应的 Controller 方法之前运行。因此,这始终是真正的应用程序之外。除非所有中间件都传递请求,否则不会执行任何 Controller 方法。

    放置在 Controller 构造函数中的$this->middleware("My\Middleware");语句会注册My\Middleware,以在请求进入应用程序之前进行检查。

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

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

    10-08 06:38