laravel构造函数和中间件执行顺序问题
2017-06-23 11:40
393 查看
今天想重构下代码结构: 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']) 或者是: 抛弃在控制器中使用用户实例
相关文章推荐
- laravel构造函数和中间件执行顺序问题
- 关于继承类执行构造函数的顺序问题
- 又一波 有关 java 静态代码块 代码块 构造函数执行顺序问题
- Java中构造函数、构造代码块、静态代码块等的执行顺序问题
- 【java】静态代码块,非静态代码块,构造函数 的执行顺序问题
- 关于类中new对象与构造函数执行顺序的问题
- 父类和子类静态代码块、非静态代码块、构造函数(方法)执行的先后顺序问题
- Java类在new的过程中,静态域、静态块、非静态域、非静态块、构造函数的执行顺序问题
- “茴”字的几种写法——C#中静态构造函数和静态变量文字执行顺序问题
- Java中构造函数执行顺序的问题
- 关于基类和派生类的构造函数和析构函数的执行顺序问题
- Java se之静态代码块、代码块、构造函数执行顺序问题
- Java中构造函数执行顺序的问题
- 关于基类和派生类的构造函数和析构函数的执行顺序问题
- Java继承的初始化与构造函数的执行顺序问题
- Java中构造函数执行顺序的问题
- 转来的:java中静态块和构造函数的执行顺序问题
- 继承关系中,静态语句块,非静态语句块,和构造函数执行顺序问题。
- 关于构造函数及变量执行顺序说明
- flex中执行顺序问题