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

举报
lxw1844912514 发表于 2022/03/27 03:54:02 2022/03/27
【摘要】 今天想重构下代码结构: BaseController.php 放置公共的中间件 class BaseController { public function __construct(){ ...
    今天想重构下代码结构:  
      
        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'])  
      
            或者是:  
                抛弃在控制器中使用用户实例  

 

文章来源: blog.csdn.net,作者:lxw1844912514,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/lxw1844912514/article/details/100028571

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。