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

今天想重构下代码结构:

	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'])

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

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值