tp6.0+ 移除了 default_module、default_controller、default_action;app_debug 行为变更;timezone 移至 config/app.php;url_route_must 改为 route_must 且默认 true;强制 .env + config/{env}/ 结构;中间件需完整类名及 __invoke 方法;旧 runtime 缓存须彻底清除。

config.php 里哪些键名在 ThinkPHP 6.0+ 被移除了
ThinkPHP 5.1 的 config.php 里常见的 default_module、default_controller、default_action 在 TP6.0+ 已彻底废弃——路由层不再走这套默认配置,而是由 route/app.php 和中间件控制。直接保留会导致启动无报错但路由失效,比如访问首页 404 却查不到原因。
容易踩的坑:
-
app_debug仍存在,但行为变了:TP6 默认从环境变量APP_DEBUG读取,硬写死在config/app.php里会覆盖环境判断 -
timezone移到了config/app.php,不在config.php根目录下 -
url_route_must改名为route_must,且默认值从false变为true
env 文件和 config 目录结构不匹配导致配置不生效
TP6 强制使用 .env + 多环境 config/{env}/ 结构。如果你沿用 TP5 的单文件 config.php 放在根目录,框架会加载它,但后续又被 config/app.php 等覆盖,造成“改了没反应”。最典型的是数据库配置:TP6 期望你在 config/database.php 里写 'hostname' => env('DB_HOST', '127.0.0.1'),而不是直接写死 host。
实操建议:
- 删掉旧版根目录下的
config.php,只保留config/目录下的模块化配置文件 -
.env必须放在项目根目录,且不能有 BOM;内容如APP_ENV=dev、DB_HOST=192.168.1.100 - 确认
config/app.php中的'env_file'项没被手动改成其他路径(默认就是.env)
中间件配置从全局数组变成类引用,漏写 use 会静默失败
TP5 的 middleware.php 是返回一个数组,比如 ['before' => ['AuthMiddleware']];TP6 要求每个中间件必须是完整类名,且需在文件顶部 use,否则框架找不到类、也不报错,只是跳过执行。
常见错误现象:
- 登录态校验中间件没触发,但日志里完全没记录
- 自定义中间件类名拼错(比如写成
AppHttpMiddlewareAuth实际是AppMiddlewareAuth) - 中间件没实现
__invoke方法,TP6 不校验,运行时报Call to undefined method
正确写法示例:
return [
'http' => [
AppMiddlewareAuth::class,
hinkmiddlewareCheckRequestCache::class,
],
];
命令行迁移时 cache:clear 报 Class not found
升级后首次运行 php think cache:clear 或 php think optimize:schema 报 Class 'thinkCache' not found,本质是旧缓存文件(runtime/cache/ 下的 PHP 文件)里还存着 TP5 的类引用,而 TP6 的类名空间已变(如 thinkCache → thinkcacheCache)。
必须做两件事:
- 手动清空整个
runtime/目录(不能只删cache/,log/和temp/里的旧文件也可能含残留引用) - 确认
composer.json中"psr-4"映射已更新为 TP6 规范:"app\": "app/",不是"app\": "application/" - 运行
composer dump-autoload -o重建自动加载,再试命令
这个点最容易被忽略:你以为清了缓存就完事,其实 runtime 下的编译缓存、模板缓存、甚至 route.php 都可能卡着老类名。一次清不干净,就得连目录一起删。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











