您的位置:首页 > 编程语言 > PHP开发

laravel构造函数和中间件执行顺序问题

2018-06-06 09:51 453 查看
今天想重构下代码结构:

BaseController.php 放置公共的中间件
class BaseController
{
public function __construct(){
$this->middleware('login');
}
}

IndexController.php 继承 BaseController
class IndexController extends BaseController
{
$user;  // 存储登录用户实例
public function __construct(){
parent::__constuct();
$this->user = Auth::user();
}
}

--------------------

如上代码,一直报错!提示获取不到用户实例!
各种测试,kernel.php, route.php, BaseController, middleware写法,等等,找不到问题。甚至一度怀疑 parent::__contruct()继承不对...

最终发现,是构造函数和中间件的执行顺序有问题:
1.先执行构造函数
2.再调用中间件
所以,我的问题就是,login中间件要求用户登录,而构造函数又先执行了,直接获取用户信息,还未登录呢!

百度发现一篇文章,描述了这个问题:
https://laravel-china.org/topics/3218/laravel53-middleware-and-controller-construction-method-execution-sequence-problem

/*
它里面提到了一句:
不可在构造函数中,直接获取到session变量或认证后的用户实例!因为中间件还未启动!

这个描述的不准确!
在用户登录后,构造函数中,自然就获取到session变量或认证后的用户实例!

主要还是中间件未在之前执行!说白了就是顺序的问题!
*/

解决方法:
都只能在route.php 中了
1>要么使用 route::get()->middle('login')
2>要么使用 route::get(['middleware' => 'login', xxx])
最好的方法,应该是使用路由组 route::group(['middleware' => 'login'])

或者是:
抛弃在控制器中使用用户实例

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: