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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java volatile关键字作用「建议收藏」

    Java volatile关键字作用「建议收藏」当一个共享变量被volatile修饰时,它会保证修改的值立即被更新到主存“,这里的”保证“是如何做到的?和JIT的具体编译后的CPU指令相关吧?  volatile特性  内存可见性:通俗来说就是,线程A对一个volatile变量的修改,对于其它线程来说是可见的,即线程每次获取volatile变量的值都是最新的。  volatile的使用场景  通过关键字sychronize…

    2022年6月1日
    31
  • pycharm安装2021_idea环境配置

    pycharm安装2021_idea环境配置环境配置这一篇是给新手朋友准备的,如果你本地已经安装配置,请自行跳过Python代码运行,需要解释器,Python解释器下载地址:https://www.python.org/鼠标悬停在Downloads上,然后选择对应的操作系统,点击版本号即可。我这里以Python3.9.2为例官网下载较慢,可以在公众号:Python极客专栏,后台回复【python392】获取安装包。下载完毕,双击打开(建议以管理员身份运行)。不建议按照默认的方式安装,参考下图点击之后出现如下界面Docu

    2022年8月29日
    5
  • Hadoop与 Spark中的Shuffle之区别与联系

    Hadoop与 Spark中的Shuffle之区别与联系Hadoop与 Spark中的Shuffle之区别与联系

    2022年4月23日
    65
  • Linux操作系统基础

    Linux操作系统基础Linux简介Linux是一种自由和开放源码的操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、台式计算机Linux介绍Linux出现于1991年,是由芬兰赫尔辛基大学学生LinusTorvalds和后来加入的众多爱好者共同开发完成Linux特点多用户,多任务,丰富的网络功能…

    2022年4月29日
    35
  • jediscluster工具类_cannot get jedis connection

    jediscluster工具类_cannot get jedis connectionRedis集群是没法执行批量操作命令的,如mget,pipeline等。这是因为redis将集群划分为16383个哈希槽,不同的key会划分到不同的槽中。原生JedisCluster对批量操作的限制是mgetmset必须在一个槽;四种批量优化的方法1、串行mget在for循环中执行一条条的get; 需要n次网络时间;2、串行IO在客户端对所有key做CR…

    2022年9月25日
    1
  • rebar3使用介绍(六)用户自定义文件配置

    rebar3使用介绍(六)用户自定义文件配置rebar3 使用介绍 五 用户自定义文件配置例子选项合并算法依赖和配置文件依赖永远按照 prod 模式对应的 profile 进行编译 不会有其他 当然不包括 default 任何东西会被额外的套用上来 即使它们是为 prod 依赖项配置的 仍然会将其提取到其声明的配置文件的配置文件目录中 例如 顶层的依赖关系 deps 将放在 build default lib 下 test 将放在 build test li

    2025年7月13日
    5

发表回复

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

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