欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

laravel构造函数和中间件执行顺序问题 Execution order in controller's constructor with middleware 有大用 有大大用

中间件在构造器中 并不是顺序执行的

image.png

处理方法 有好多 1) 把中间件放到路由里 

2)或者 在另一个中间件 比如这里 issubscribe 里进行取Session::get('wechat.oauth_user') 里面的数据,

然后再存Session::put('curr_wx_user_id'),之后呢, return redirect($request->fullUlr()); 这样子的话才返回来原来的路由Controller

此时 在这个控制器里 判断是否有 Session::get('wechat.oauth_user') 有这个数据的话就执行正常的代码

没有的话 就 

$this->middleware('wechat.oauth_user');

$this->middleware('issubscribe');

如下图所示

image.png





fdfdsf

[html] view plain copy                    
  1. 今天想重构下代码结构:  

  2.   

  3.     BaseController.php 放置公共的中间件  

  4.     class BaseController  

  5.     {  

  6.         public function __construct(){  

  7.             $this->middleware('login');    

  8.         }  

  9.     }  

  10.   

  11.     IndexController.php 继承 BaseController  

  12.     class IndexController extends BaseController  

  13.     {  

  14.         $user;  // 存储登录用户实例  

  15.         public function __construct(){  

  16.             parent::__constuct();  

  17.             $this->user = Auth::user();  

  18.         }  

  19.     }  

  20.   

  21.     --------------------  

  22.   

  23.     如上代码,一直报错!提示获取不到用户实例!  

  24.     各种测试,kernel.php, route.php, BaseController, middleware写法,等等,找不到问题。甚至一度怀疑 parent::__contruct()继承不对...  

  25.   

  26.     最终发现,是构造函数和中间件的执行顺序有问题:  

  27.         1.先执行构造函数  

  28.         2.再调用中间件  

  29.     所以,我的问题就是,login中间件要求用户登录,而构造函数又先执行了,直接获取用户信息,还未登录呢!  

  30.   

  31.   

  32.     百度发现一篇文章,描述了这个问题:  

  33.         https://laravel-china.org/topics/3218/laravel53-middleware-and-controller-construction-method-execut...  

  34.   

  35.     /*  

  36.         它里面提到了一句:  

  37.             不可在构造函数中,直接获取到session变量或认证后的用户实例!因为中间件还未启动!  

  38.   

  39.         这个描述的不准确!  

  40.             在用户登录后,构造函数中,自然就获取到session变量或认证后的用户实例!  

  41.   

  42.         主要还是中间件未在之前执行!说白了就是顺序的问题!  

  43.     */  

  44.   

  45.     解决方法:  

  46.         都只能在route.php 中了  

  47.             1>要么使用 route::get()->middle('login')  

  48.             2>要么使用 route::get(['middleware' => 'login', xxx])  

  49.         最好的方法,应该是使用路由组 route::group(['middleware' => 'login'])  

  50.   

  51.         或者是:  

  52.             抛弃在控制器中使用用户实例  


       
个人分类: laravel框架    

来自  https://blog.csdn.net/beyond__devil/article/details/73617511


Laravel5.3 中间件和控制器构造方法执行顺序问题


我在项目中创建了一个判断移动端还是PC端的中间件,然后发现中间件在控制器构造方法执行完后才调用了,然后重新建了个项目试了下。

class WebInit
{
/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @return mixed
 */
public function handle($request, Closure $next)
{
    dump('a');
    return $next($request);
}
}   


然后控制器里

class MainController extends Controller
{
  public function __construct()
{
    dump('b');
}
public function index(){
    dump('c');

}
}


最后访问一下本地

file

然后找了一下5.3的变更文档发现

file
想问一下laravel5.3以后这么处理的原因是什么,感觉这样想获取数据要每个方法都要从request里获取值挺麻烦的

来自  https://laravel-china.org/topics/3218/laravel53-middleware-and-controller-construction-method-execut...


Execution order in controller's constructor with middleware (Laravel 5.4)

PUBLISHED 10 MONTHS AGO BY NULELE

Hello,

I'm facing a weird problem on execution order inside a controller's constructor.

Consider this Controller code:

public function __construct()
{
    $this->middleware(MyStupidMiddleware::class);
    echo "2";
}
               

And MyStupidMiddleware code:

public function handle($request, Closure $next)
{
    echo "1";

    return $next($request);
}
               

When I execute the request, I get 2 and 1!

WHY?

Parasoul                    
 Parasoul                            
10 months ago(12,710 XP)                        

As i remember, Laravel build controller first. So anything in the constructor is call before the routes/controllers middlewares.

Edit :

https://laravel-news.com/controller-construct-session-changes-in-laravel-5-3                                

nulele                    
nulele                            
10 months ago(70 XP)                        

Thank you Parasoul but your link is about using sessions in controller's constructor... maybe I'm wrong but this has nothing to do with my problem that it seems more general.

My problem is about the execution order of code in the constructor itself.

d3xt3r                    
d3xt3r                            
10 months ago(135,680 XP)                        

$this->middleware(MyStupidMiddleware::class);

It does not actually execute the middleware code but add it to the list to be executed later ...

来自  https://laracasts.com/discuss/channels/general-discussion/execution-order-in-controllers-constructor...

普通分类: