framework icon indicating copy to clipboard operation
framework copied to clipboard

多模块下,miss路由失效

Open SamCheng0717 opened this issue 10 months ago • 7 comments

所属功能组件

路由(Route)

ThinkPHP 版本

8.1.2

操作系统

Windows

错误信息

多模块情况下miss路由失效

仅有以下一个路由文件

`<?php // +---------------------------------------------------------------------- // | ThinkPHP [ WE CAN DO IT JUST THINK ] // +---------------------------------------------------------------------- // | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved. // +---------------------------------------------------------------------- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) // +---------------------------------------------------------------------- // | Author: liu21st [email protected] // +---------------------------------------------------------------------- use think\facade\Route; // 多模块下如何定义路由 // 参考 https://doc.thinkphp.cn/@wiki/custom-directory-with-route.html Route::group(function () { Route::get('/', 'XingMing/index'); Route::miss(function () { return '404'; }); })->namespace('app\controller\web');

Route::miss(function () { return '404'; }); Route::auto();`

附route.php参数配置

`<?php // +---------------------------------------------------------------------- // | 路由设置 // +----------------------------------------------------------------------

return [ // pathinfo分隔符 'pathinfo_depr' => '/', // 是否开启路由延迟解析 'url_lazy_route' => false, // 是否强制使用路由 'url_route_must' => true, // 是否区分大小写 'url_case_sensitive' => false, // 合并路由规则 'route_rule_merge' => false, // 路由是否完全匹配 'route_complete_match' => true, // 去除斜杠 'remove_slash' => false, // 默认的路由变量规则 'default_route_pattern' => '[\w.]+', // URL伪静态后缀 'url_html_suffix' => 'html', // 访问控制器层名称 'controller_layer' => 'controller', // 空控制器名 'empty_controller' => 'Error', // 是否使用控制器后缀 'controller_suffix' => false, // 默认模块名(开启自动多模块有效) 'default_module' => 'index', // 默认控制器名 'default_controller' => 'Index', // 默认操作名 'default_action' => 'index', // 操作方法后缀 'action_suffix' => '', // 非路由变量是否使用普通参数方式(用于URL生成) 'url_common_param' => true, // 操作方法的参数绑定方式 route get param 'action_bind_param' => 'get', // 请求缓存规则 true为自动规则 'request_cache_key' => true, // 请求缓存有效期 'request_cache_expire' => null, // 全局请求缓存排除规则 'request_cache_except' => [], // 请求缓存的Tag 'request_cache_tag' => '',
];`

其它说明

No response

SamCheng0717 avatar Mar 13 '25 13:03 SamCheng0717

https://github.com/top-think/framework/issues/3125#issuecomment-2688205303

big-dream avatar Mar 13 '25 13:03 big-dream

同理。同目录下的空控制器也不会被调用。

`<?php namespace app\controller\web;

class Error { public function __call($method, $args) { return 'error request!'; } }`

SamCheng0717 avatar Mar 13 '25 13:03 SamCheng0717

我通过在分组内去掉namespace的方式使miss路由重新生效。希望能检查这个问题,期待复现问题并给出方案。

SamCheng0717 avatar Mar 13 '25 13:03 SamCheng0717

可以用开发版测试下这个问题 有改进过

liu21st avatar Apr 01 '25 08:04 liu21st

miss依然失效,新问题:访问 http://localhost:8000/web/index/hello/tp 控制器无法正确接收参数 控制器位置 app/controller/web/Index.php

use think\facade\Route;

Route::get('think', function () { return 'hello,ThinkPHP8!'; }); Route::get('hello/:name', 'web/index/hello'); Route::auto(); Route::miss(function() { return '404 Not Found!'; });

SamCheng0717 avatar Apr 03 '25 09:04 SamCheng0717

版本:version 8.x-dev

SamCheng0717 avatar Apr 03 '25 09:04 SamCheng0717

miss依然失效,新问题:访问 http://localhost:8000/web/index/hello/tp 控制器无法正确接收参数 控制器位置 app/controller/web/Index.php

use think\facade\Route;

Route::get('think', function () { return 'hello,ThinkPHP8!'; }); Route::get('hello/:name', 'web/index/hello'); Route::auto(); Route::miss(function() { return '404 Not Found!'; });

去掉auto路由定义 改用多模块分组定义

liu21st avatar Apr 03 '25 13:04 liu21st