Laravel 5.3 控制器 __construct 在中间件之前调用

Laravel 5.3 Controller __construct called before middleware

我有一个 Controller parent class,它接受中间件添加到 $request 的一些属性,并使它们对所有子 classes 可用。

所以在我的中间件 handle() 函数中我有:

$request->attributes->add(['project' => $project]);

在我的控制器中 __construct() 我有:

$this->project = $request->attributes->get('project');

这在 5.2 中运行良好,但自升级到 5.3 后,我意识到控制器 __construct() 在我的中间件 handle() 函数之前被调用,因此 'project' 属性是 null.

有谁知道为什么在控制器之后调用中间件? 从 5.2 到 5.3 有什么变化吗?

谢谢!

看起来这是 5.3 中的更改:

https://laravel-news.com/2016/08/controller-construct-session-changes-in-laravel-5-3/

所以现在你可以像这样在 Controller 构造函数中调用中间件:

$this->middleware(function ($request, $next) {
    $this->request = $request;
    $this->project = $request->attributes->get('project');

    return $next($request);
});

因为controller中间件最后会被调用,这样就可以在route中间件设置好后访问class中的request属性

干杯。