多层Route::group,中间件顺序反了

ric

问题描述

"name": "workerman/webman-framework",
"version": "v1.5.8",

多层Route::group,中间件规则应该是:
全局中间件 -》 应用中间件 -》 最外层 Route::group中间件 -》里层Route::group中间件 -》 Route::post等具体路由中间件

但实际的执行情况是:
全局中间件 -》 应用中间件 -》 Route::post等具体路由中间件 -》里层Route::group中间件 -》 最外层 Route::group中间件

也就是通过路由文件上配置的中间件执行顺序反过来了

程序代码或配置

 Route::group('/toadmin', function () {
    //权限相关模块
    Route::group('/auth', function () {
        //登录
        Route::post('/login', [app\toadmin\controller\Index::class, 'index'])->middleware([new app\common\middleware\Auth(['toadmin', 'login'])]);
    });

})->middleware([new app\common\middleware\Decryption(['toadmin'])]);

上面执行 /toadmin/auth/login 本意是先Decryption,然后Auth
执行结果是先Auth然后再到Decryption了

重现问题的步骤

写个多层路由中间件即可复习

操作系统环境及workerman/webman等具体版本

"name": "workerman/webman-framework",
"version": "v1.5.8",

##############处理################
vendor/workerman/webman-framework/src/App.php
219行 $routeMiddlewares = array_reverse($route->getMiddleware());

这里进行了反转,其实是不需要的,应该改为$routeMiddlewares = $route->getMiddleware();

执行顺序是倒过来的,
$middlewares = array_merge($middlewares, Middleware::getMiddleware($plugin, $app, $withGlobalMiddleware));

可以看出,合并全局和应用中间件的时候,是添加在数组后的

453 3 1
3个回答

wocall

研究的真深

  • ric 2023-09-11

    刚好用到,结果出现的预料外的情况而已

  • ric 2023-09-11

    @walkor 大佬看下,确认的话,看看能否修复下,迁移的时候刚好用到

PHP甩JAVA一条街

意思是老大写错代码了吗

  • ric 2023-09-11

    估计是升级框架的时候没有改到

walkor

确实反了,感谢反馈。

  • walkor 2023-09-11

    修复了,执行
    composer require workerman/webman-framework ^1.5.9
    升级

  • ric 2023-09-11

    👍👍👍

🔝