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

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'])  
      
            或者是:  
                抛弃在控制器中使用用户实例  

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 如何删除LDSGameMaster[通俗易懂]

    如何删除LDSGameMaster[通俗易懂]如何删除LDSGameMaster背景介绍方法一方法二背景介绍最近不小心下载安装了鲁大师,卸载之后,C盘中仍有一个名为LDSGameMaster的文件夹。虽然很小,之后18M,但是一定要删除掉,否则心里很不舒服。方法一百度告诉我,解决这个问题很简单。这个文件夹中有个uninstall,运行之后就没有了。但我没有发现我的文件夹中有这么一个东西。这个方法不提。方法二删除之后,提示:操作无法…

    2022年6月13日
    83
  • pycharm使用anaconda的虚拟环境_pycharm解释器为空

    pycharm使用anaconda的虚拟环境_pycharm解释器为空项目场景:在pycharm中新建项目,如果需要新建python环境时的全部操作问题描述:显示所有的python解释器:condainfo-eanaconda已经安装好了,创建新的python环境:condacreate–namepython37python=3.7#创建一个名字为python37,版本是python3.7的新环境,conda会自动安装3.7的最新版本;它会把新安装的python环境放在anaconda3的envs目录下:…

    2022年8月26日
    6
  • JS数组合并(5种)

    JS数组合并(5种)前言项目过程中,经常会遇到JS数组合并的情况,时常为这个纠结。这里整理一下。简单而实用的for最容易想到的莫过于for了。会变更原数组,当然也可以写成生成新数组的形式。letarr=[1,2]letarr2=[3,4]for(letiinarr2){arr.push(arr2[i])}console.log(arr)//[1,2,3,4]arr.concat(arr2)会生成新的数组。letarr=[1,2]let

    2022年6月30日
    40
  • 实时数据库 内存数据库_实时数据库产品

    实时数据库 内存数据库_实时数据库产品这是一款实时和嵌入式软件,用来管理持续增长的复杂数据,来支持高级应用的特性。性能和可靠性,更短的产品开发周期等需求,驱使开发者在他们的设计中,考虑采用经验证的、成熟的商业数据库系统组件来,来满足应用层的这些需求。  McObject公司的eXtremeDB嵌入式数据库系列产品是将高性能、稳定性和简单易用性等特性同时融入了工业基的数据库引擎。  了解eXtremeDB产品系列或eXtreme…

    2022年10月14日
    0
  • android studio 导入eclipse乱码解决「建议收藏」

    android studio 导入eclipse乱码解决「建议收藏」在开发过程中遇到androidstudio导入eclipse乱码,综合网上查找的答案,我是这样解决的:1、首先在module的bulid.gradle文件的android标签中加入以下内容:applyplugin:’com.android.xxxx’android{compileSdkVersion21buildToolsVersion”21.

    2022年5月25日
    31
  • .NET程序的编译和运行

    程序的编译和运行,总得来说大体是:首先写好的程序是源代码,然后编译器编译为本地机器语言,最后在本地操作系统运行。下图为传统代码编译运行过程:.NET的编译和运行过程与之类似,首先编写好的源代码,然

    2021年12月22日
    52

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号