Laravel 5 documentation描述了分配中间件的两种方法:
但是,我意识到,即使在 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通过首先注册所有中间件,然后将请求逐个通过所有中间件来解决此问题。