zoukankan      html  css  js  c++  java
  • 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'])  
          
                或者是:  
                    抛弃在控制器中使用用户实例  
  • 相关阅读:
    为什么你投十份简历,只有一两家公司约你?又或者为什么你每投一份简历都能获得面试机会?
    JAVA程序1,1,2,3,5,8,13,21....第30个是什么...?
    1-2+3-4+5-6+7......+n的几种实现
    分层应用——如何实现登录?
    初识三层
    VB.NET视频总结——后续篇
    操作系统小结
    VB.NET视频总结——基础篇
    台湾与大陆的计算机术语翻译差异
    VB.NET概述
  • 原文地址:https://www.cnblogs.com/lxwphp/p/15454279.html
Copyright © 2011-2022 走看看