前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >laravel构造函数和中间件执行顺序问题

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

作者头像
全栈程序员站长
发布2022-07-07 13:21:46
7550
发布2022-07-07 13:21:46
举报
文章被收录于专栏:全栈程序员必看
代码语言:javascript
复制
    今天想重构下代码结构:  
      
        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'])  
      
            或者是:  
                抛弃在控制器中使用用户实例  

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/113214.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021年10月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档