TP6升级需修改Db::name()为Db::table()或模型调用,中间件handle方法须加$params参数,url()需启用路由或改用命名路由,行为扩展应迁至事件系统或中间件。

ThinkPHP 5.1 升级到 6.x 时,Db::name() 调用直接报错
这是因为 TP6 彻底移除了 Db::name() 的字符串表名写法,只接受模型类或已注册的查询器。旧代码里满屏的 Db::name('user')->where(...) 全部会抛出 InvalidArgumentException。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 批量替换为
Db::table('user')—— 注意是table()不是name(),且不走模型逻辑 - 若需模型能力(自动时间戳、软删除等),必须新建对应模型类,比如
UserModel,然后用app\model\UserModel::where(...) - 别在迁移初期混用
Db::table()和模型,容易因事件钩子缺失导致数据不一致(例如before_insert里的字段填充失效)
TP5 的中间件升级到 TP6 后不生效,handle() 方法完全没被调用
TP6 中间件签名变了:老版本是 public function handle($request, Closure $next),新版本强制要求第三个参数 $params = [],缺了就匹配失败,框架直接跳过该中间件。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 所有中间件方法签名必须改为
public function handle($request, Closure $next, $params = []) - 检查
app/middleware.php配置,TP6 不再支持闭包定义中间件,必须传类名数组,如['app\middleware\Auth'] - 全局中间件和路由中间件注册位置不同:全局写在
app/middleware.php,路由级要显式调用->middleware(Auth::class),漏写等于没加
模板中 {:url('index/index')} 在 TP6 下生成错误路径
TP6 默认关闭了 URL 自动生成的「模块/控制器/操作」隐式解析,url() 助手函数不再自动补全模块名,且路由规则优先级高于传统路径解析。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 确认是否启用了
url_route_on(默认 true),若关了,url()就退化为纯拼接,必须写全{:url('index/index/index')} - 更稳妥的做法是统一走命名路由:
Route::get('home', 'index/index')->name('home'),模板中改用{:url('@home')} - 注意
url()在 CLI 环境下默认不带域名,前端 Ajax 请求可能因相对路径出错,建议配置url_domain_deploy或手动补http://
TP5 的行为扩展(behavior)在 TP6 中彻底废弃,但业务逻辑耦合严重
TP6 把行为机制删了,原来挂在 app/behavior 下的一堆日志、权限、缓存清理逻辑,现在没地方挂载。强行保留会导致生命周期钩子失效,比如 app_init 行为里的初始化代码根本不会执行。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 优先迁移到事件系统:用
Event::trigger('user_login')替代行为触发,监听器放app/event.php或单独目录 - 若原行为只是做前置校验(如登录态检查),改写成中间件更自然,也符合 TP6 的请求生命周期设计
- 别试图用 traits 模拟行为——看似能复用代码,但无法保证执行时机,比如模型 save 前的 hook 很可能错过事务边界
重构中最容易被忽略的是数据库事务与模型事件的时序变化:TP6 的模型事件默认在事务内触发,而 TP5 的行为常在事务外执行。这点不验证清楚,上线后可能出现「日志写了但数据回滚了」的静默异常。



















