ThinkPHP 5.1 迁移至 6.0.16 需结构重写与语义适配,涵盖命名空间、配置加载、路由定义、数据库模型、模板跳转五方面,任一遗漏均可能导致白屏或静默失效。

ThinkPHP 5.1 迁移到 6.0.16 不是文件覆盖,而是结构重写+语义适配。核心改动集中在命名空间、配置加载、路由定义、数据库与模型行为、模板及辅助功能五方面,漏改一项就可能白屏或静默失效。
命名空间与类引用必须重写
TP6 彻底废弃短命名空间,所有 think\Controller、think\Model 等全局类全部移入 think\facade 或 think\db 下:
- 控制器中
use think\Controller;改为继承think\controller\Base(无需 use),视图操作用use think\facade\View; - 模型类必须显式声明
use think\Model as BaseModel;并继承BaseModel - 数据库操作统一用
think\db\Query,禁用new Db()或new \think\Db()—— 全局搜索并人工核对删除 - 助手函数如
dump()、input()仍可用,但底层已迁移至think\facade\*,不再推荐手动use think\helper\*
配置目录结构与加载逻辑变更
TP6 的 config/ 目录必须扁平化,且默认只加载 app.php、database.php、cache.php 等预设文件:
- 把原
config/下所有子目录(如config/api/)中的配置文件全部移至config/根目录 - 自定义配置(如
api.php)不会自动加载,需在启动或中间件中显式调用:Config::load('api', 'api'); -
database.php中的'type' => 'MySQL'必须小写('mysql'),否则报Driver [MySQL] not supported - 旧版
config('database.hostname')全部改为Config::get('database.hostname')
路由注册与中间件绑定方式重构
TP6 路由完全重写,字符串路径写法失效,中间件不再全局注入:
立即学习“PHP免费学习笔记(深入)”;
- 删除
route/route.php中所有Route::get('index', 'index/index')类型写法,改为数组或闭包:Route::get('index', [\app\controller\Index::class, 'index']); - 中间件必须显式绑定:用
Route::middleware()绑定到某条路由,或在控制器构造函数中调用$this->middleware(...) - 多应用模式下,
route/app.php仅对当前应用生效;跨应用路由需在对应应用的route.php中单独定义 - 取消了控制器内直接调用
Route::get()的能力,所有路由必须在route.php中返回RuleGroup实例
数据库与模型行为兼容性调整
查询返回值、字段操作、验证规则等语义收紧,不能靠“看起来像”来蒙混过关:
-
Db::table('user')->select()返回Collection对象,判空需用!$result->isEmpty()或先转数组:$result->toArray() - 模型取消
get()、all()、getOrFail()等快捷方法,统一用find()/select() - 字段排除改用
withoutField('id,name'),不再支持field('id,name', true) - 关联删除参数从字符串变为数组:
$article->together(['comments'])->delete(); - 模型验证器中禁用闭包规则(如
['require', function() {...}]),改用独立验证器类或validate()方法
模板、跳转、Session 等高频功能补全
TP6 默认不带模板引擎和跳转封装,需按需安装并手动启用:
- 安装模板引擎:
composer require topthink/think-view,并在app/config/view.php中开启布局:'layout_on' => true, 'layout_name' => 'public/layout' -
$this->success()、$this->error()、redirect()已移除,需安装扩展:composer require liliuwei/thinkphp-jump,再在基类中引入use liliuwei\think\Jump; - Session 默认未开启,需在
app/middleware.php的中间件列表中加入:\think\middleware\SessionInit::class - 模板常量(如
__STATIC__)需在config/view.php的tpl_replace_string中明确定义,且值必须为完整路径(不支持嵌套常量)



















