framework icon indicating copy to clipboard operation
framework copied to clipboard

8.1 路由异常

Open FlameMida opened this issue 10 months ago • 11 comments

所属功能组件

路由(Route)

ThinkPHP 版本

8.1.2

操作系统

debian/mac/windows

错误信息

Route::group(function () {

    Route::get('index', 'v1.PublicController/index')->name('index')->option(['real_name' => '首页']);

  
    Route::get('user/xxx', 'v1.user.UserController/xxx')->name('xxx')->option(['real_name' => 'xxx']);
    
    Route::group(function () {
        Route::get('user/member/card/index', 'v1.user.MemberCardController/index')->name('userMemberCardIndex');
    });

    Route::group(function () {
        Route::get('bb/bb', 'v1.user.bbb/bb')->name('bb')->option(['real_name' => 'bbb']);
    });
});

user/member/card/index 上面的路由都可以正常访问,下面的路由全都404 把 bb/bb 放到 user/member/card/index 上面后 bb/bb 可以正常访问 bb/bb 下面的404了

其它说明

No response

FlameMida avatar Jan 23 '25 02:01 FlameMida

  Route::group('coupons', function () {
        Route::get('/user', 'UserCouponsController/user')->name('couponsUser');

        Route::post('/usable', 'UserCouponsController/usable')->name('couponsUsable');
    })->prefix('v1.user.');

使用prefix后整个路由组也会404

FlameMida avatar Jan 23 '25 02:01 FlameMida

你这种路由定义 后面的是执行不到的 不管哪个版本都一样 和8.1无关

liu21st avatar Jan 23 '25 03:01 liu21st

8.0.4可以用啊

FlameMida avatar Jan 23 '25 03:01 FlameMida

Route::group('a', function () {
    Route::group(function () {
        Route::get('b',function (){
            return 'b';
        });
    });
    Route::group(function (){
        Route::get('c',function (){
            return 'c';
        });
    });
});

我是升级8遇到这个问题, a/b 可以访问, a/c not found 我是在crmeb代码里面发现很多这种group没有name名的这种分组,我不知道以前是不是支持这样写,或者是bug刚好可以这样写 以前是6.1.5的版本 现在是8.1.2版本是不支持这样写了

是否可以让它支持下面这种写法,或有其他解决方案

Route::group('a', function () {
    Route::group(function () {
        Route::get('b',function (){
            return 'b';
        });
    })->name('b');
    Route::group(function (){
        Route::get('c',function (){
            return 'c';
        });
    })->name('c');
});

@liu21st 请确认下

runphp avatar Mar 21 '25 04:03 runphp

https://github.com/top-think/framework/pull/3128 我尝试修复了这个问题,我这边测试了下没有问题了 @FlameMida @liu21st

runphp avatar Mar 21 '25 07:03 runphp

https://github.com/top-think/framework/commit/ac14f535ffcb46c6a017b94df881bb44b5172742

在这一次提交记录里面,https://github.com/top-think/framework/commit/ac14f535ffcb46c6a017b94df881bb44b5172742#diff-c8a08aa36a5de9b4314a7d18c69ffaae6945343bc00fd79775232dc5ce04b0e4R312 这个位置的逻辑是直接return了,我觉得应该继续循环进行判断是否有匹配的路由

Image

如图 $rules 有多条记录的时候,如果未满足条件被直接return了,我的修改是如果false应该继续检查其他路由是否满足 @liu21st 你看下是不是这个问题

runphp avatar Mar 21 '25 07:03 runphp

两个相同的分组为啥不合并呢?

liu21st avatar Mar 22 '25 00:03 liu21st

两个相同的分组为啥不合并呢?

首先以前的版本确实支持的,至于使用场景是有的

我的情况是使用相同中间件的合并成一组,但路由还是想保持一致,比如用户开通了某个功能的时候某些路由会有不同的业务逻辑,这些路由我就合并到一起,这些路由会添加某个中间件

crmeb那边是不同功能组进行了分组,是option不同分组,他这个是路由功能扩展了

你可以看下 https://gitee.com/ZhongBangKeJi/CRMEB/blob/master/crmeb/app/adminapi/route/setting.php

runphp avatar Mar 22 '25 22:03 runphp

是不是开启了分组合并路由检测后导致的?

liu21st avatar Mar 23 '25 03:03 liu21st

是不是开启了分组合并路由检测后导致的?

我有仔细看了下代码确实是 这个问题 新版本需要 把 'route_rule_merge' => false

runphp avatar Mar 23 '25 07:03 runphp

是不是开启了分组合并路由检测后导致的?

我有仔细看了下代码确实是 这个问题 新版本需要 把 'route_rule_merge' => false

我记得这个参数默认就应该是false吧 这个地方的改进是为了支持嵌套分组的路由规则直接合并解析 如果要做太多调整的话 不如直接去掉也不影响实际解析的

liu21st avatar Mar 23 '25 10:03 liu21st