tp6升级需修改命名空间、配置加载、路由定义、数据库返回类型及模型验证规则:类引用移至think\facade和think\db;config目录扁平化;路由改用数组/闭包并显式绑定中间件;db查询返回模型实例需调用toarray();模型validate属性禁用闭包。

ThinkPHP 6.0 升级必须改的命名空间和类引用
TP6 彻底废弃了 think\Controller、think\Model 这类全局短名,全部移到 think\facade 和 think\db 下。不改就报 Class 'think\Controller' not found。
实操建议:
- 把所有
use think\Controller;换成use think\facade\View;(如果用视图)或直接删掉(TP6 默认控制器继承think\controller\Base,不再需要手动 use) -
use think\Model;必须改成use think\Model as BaseModel;,且模型类需显式继承BaseModel - 助手函数如
dump()、input()仍可用,但底层已从think\helper\*移到think\facade\*,不建议再手动use助手类
config 目录结构和配置加载方式变了
TP6 把 config.php 拆成按模块组织的目录,且默认只加载 app、database、cache 等预设文件,旧版自定义配置(比如 config/api.php)不会自动加载。
常见错误现象:升级后 Config::get('api.timeout') 返回 null,但文件明明存在。
实操建议:
- 把原
config/下所有文件移入config/根目录(TP6 的 config 目录就是扁平的),不要嵌套子目录 - 若需加载非默认配置,调用
Config::load()显式载入,例如:Config::load('config/api.php', 'api'); -
database.php中的type值必须小写(mysql),大写(MySQL)会触发驱动未找到错误Driver [MySQL] not supported.
路由定义语法和中间件绑定逻辑不兼容
TP6 路由完全重写,闭包定义、资源路由、分组路由的写法全变,且中间件必须显式绑定,不能再靠配置文件自动附加。
典型报错:Method App\controller\Index::hello does not exist(路由指向了不存在的方法,其实是没正确注册)
实操建议:
- 删除
route/route.php中所有 TP5.x 风格的Route::get()字符串路径写法,改用数组或闭包,例如:Route::get('index', 'index/index');→Route::get('index', [\app\controller\Index::class, 'index']); - 中间件不再通过
middleware.php全局绑定,改用Route::middleware()或控制器构造函数中调用$this->middleware(...) - 如果用了多应用模式,注意
route/app.php只对当前应用生效,跨应用路由需在对应应用的route.php中单独定义
数据库查询链式调用返回对象类型变了
TP6 的 Db::table()->where()->find() 返回的是 think\model\Pivot 或 think\model\Relation 实例,不再是 TP5.x 的数组或 \think\Model 对象;直接 json_encode() 会出错或漏字段。
性能影响:模型实例化开销比纯数组略高,高频接口需注意。
实操建议:
- 查询单条记录后想转数组,别再用
(array)$result,改用$result->toArray()(模型)或$result->toRawArray()(跳过自动转换) - 批量查询用
select()后,遍历前先统一转数组:$list->toArray(),否则 foreach 里取属性可能触发懒加载 - 使用
with()关联预载时,确保关联方法在模型中已正确定义,TP6 不再容忍“关联方法不存在却写了 with”这种宽松行为
最常被忽略的一点:TP6 的模型验证规则写法变了,validate 属性必须是数组或 validate 类名字符串,不能是闭包——这个错不会立即报,但提交数据时验证直接跳过。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










