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


相关推荐

  • 数据库拉链表详解_拉链表断链

    数据库拉链表详解_拉链表断链一、前言在上一节简单介绍了拉链表,本节主要讲解如何通过binlog采集MySQL的数据并且按月分区的方式实现拉链表。这里以上节介绍的用户表(user)举例二、涉及到的表1.原始表(user)原始表指的是MySQL中的表,表结构如下:其中name为主键,如果没有主键则无法做拉链表。2.binlog流水表(user_binlog)操作类型字段枚举值为:insert、update、delete。设…

    2022年10月17日
    0
  • java.text.NumberFormat使用方法

    java.text.NumberFormat使用方法

    2021年12月6日
    41
  • linux find命令详解_linux du命令详解

    linux find命令详解_linux du命令详解find命令格式:findpath-option[-print][-exec-okcommand]{}\;find命令的参数:path:要查找的目录路径。~表示$HO

    2022年7月30日
    5
  • c语言心形曲线_c语言怎么画心

    c语言心形曲线_c语言怎么画心原理:利用内嵌循环绘制方程:(x2+y2−1)3=x2y3(x^2+y^2-1)^3=x^2y^3(x2+y2−1)3=x2y3的图像代码:/*说明:本程序的原理是根据方程(x^2+y^2-1)^3=x^2*y^3作差得值f,若f<=0,则用’*’填充,否则就用”填充最后得到了心形曲线*/#include<cstdio>#include<iostream>usingnamespacestd;intmain(){float

    2022年8月31日
    0
  • 接口测试简介以及接口测试用例设计思路

    接口测试简介以及接口测试用例设计思路接口测试简介1.什么是接口接口就是内部模块对模块,外部系统对其他服务提供的一种可调用或者连接的能力的标准,就好比usb接口,他是系统向外接提供的一种用于物理数据传输的一个接口,当然仅仅是一个接口是不能进行传输的,我们还的对这个接口怎么进行传输进行进行一些设置和定义。开发所谓的接口是模块模块之间的一种连接,而测试眼中的接口是一种协议(对接口的功能的一种定义)2.接口的种类和分类外部接…

    2022年6月28日
    25
  • mbus接口电路_数据总线

    mbus接口电路_数据总线本文来自我的163博客搬移春节放假前到现在,设计了一款采集器,采集器的设计按照标准的MBUS协议设计,设计容量为最大可同时对100只水表的水量数据进行采集。硬件设计:原理图设计上采用自顶向下的分层电路图设计方法,分为5个电路子图,分别为单片机小系统部分、电源部分、MBUS协议部分、短路保护部分、通信部分。1、单片机小系统部分的设计上将编程引脚的时钟和…

    2022年10月16日
    0

发表回复

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

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