tp6 废除 tp5 的自动控制器解析机制,index.php?s=index/index 因无显式路由而 404;移除 controller_auto_search 等配置及 request()->controller() 等方法;路由须显式注册,url 生成需用命名路由或类方法地址,多模块须转为多应用。

ThinkPHP 6 不再支持 TP5 风格的“传统控制器”自动解析机制,index.php?s=index/index 这类 URL 会直接 404 —— 不是路由没写对,是框架压根不识别这种路径格式。
为什么 index/index 路径在 TP6 里直接失效
TP6 彻底关闭了 controller_auto_search 和 url_auto_redirect,也不再从 URL 路径中自动提取控制器名和操作名。它只认你显式注册的路由规则,或者通过命名空间+方法名(如 app\controller\Index@read)生成的 URL。
- TP5 的
index/index是靠框架内部根据路径字符串动态反射控制器类,TP6 把这套逻辑全删了 -
request()->controller()、request()->action()等运行时方法已移除,调用即报错 - 即使你保留了
app/controller/Index.php文件,没有对应路由,访问/index或/index/index依然 404
必须重写所有路由,不能靠“兼容开关”恢复旧行为
别指望改个配置就能让 TP6 像 TP5 一样跑起来。没有 enable_controller_parse 这种开关,也没有隐藏的 fallback 机制。
- 所有原 TP5 的路由定义(比如
Route::get('user/:id', 'index/user/read'))必须迁移到app/route.php或应用级app/index/route.php - 闭包路由、数组路由写法不再被支持,必须用
Route::get()、Route::post()等显式注册 - 原来写在
config/route.php里的全局规则,现在必须全部剪切到app/route.php,且该文件只能调用Route实例方法,不能return [] - 正则简写(如
[:id\d+])已废弃,要改成完整 pattern:Route::get('user/:id', 'User/read')->pattern(['id' => '\d+'])
url() 函数传参方式变了,老写法静默失败
TP5 里 url('index/index', ['id'=>1]) 能生成 /index/index/id/1;TP6 同样写法不会报错,但结果是空字符串或原始字符串,参数完全丢失。
- 必须使用命名路由:先在路由文件里写
Route::get('article/:id', 'Index/read')->name('article.read'),再用url('article.read', ['id' => 123]) - 也可以用类方法地址:
url('app\controller\Index@read', ['id' => 123]),但前提是该方法已被某条路由规则匹配到(比如开启了资源路由或显式绑定了 GET) - 不要传
['index/index']这种数组,url()不解析控制器/操作字符串,只会拼成/index%2Findex?id=1导致 404 - 需要 query 参数(如
?id=1)必须显式加['query' => ['id' => 1]],否则不会出现在 URL 中
多模块项目必须转为多应用,且跨应用调用默认禁用
TP5 的多模块(application/admin、application/api)在 TP6 里不存在,“模块”概念被“应用”替代,且每个应用完全独立。
- 需先安装扩展:
composer require topthink/think-multi-app - 原
application/admin要挪到app/admin,并确保其route.php和config/独立存在 - 应用间默认不能互相调用控制器、模板或路由,
url('admin/index')在 index 应用里无效,除非你手动定义跨应用命名路由 - 原
U('admin/index')必须全部替换,不能靠封装函数兜底——那只会掩盖路由缺失问题 - 如果你还依赖
request()->module()判断当前上下文,得改用app('http')->getName()获取当前应用名
最易被忽略的一点:TP6 的路由别名默认关闭,url('admin') 不会自动映射到 admin/index/index,哪怕你写了 Route::get('admin', 'Admin/Index/index')->name('admin'),也必须在 config/route.php 里显式开启 'route_alias' => true,否则 url() 直接返回空。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











