TP8废弃Db门面、模型自动验证和传统字符串路由,需改用依赖注入获取Db实例、显式绑定验证器类、使用数组/注解路由,并手动加载自定义配置。

TP5 的 Db::name() 在 TP8 里直接报错怎么办
TP8 彻底移除了全局 Db 门面,Db::name('user') 这种写法会抛出 Class "thinkDb" not found。这不是配置问题,是架构级废弃。
必须改用依赖注入或容器获取实例:
- 控制器中推荐用构造函数注入:
public function __construct(protected hinkacadeDb $db) {},之后调用$this->db->name('user') - 临时使用可从容器取:
app('db')->name('user'),但不建议在多处硬编码 - 注意:TP8 的
hinkacadeDb是门面类,实际执行仍走hinkdbConnection,行为一致,但命名空间和加载方式变了
TP5 的 validate() 方法在模型里失效了
TP8 模型默认不再自动验证,validate(true) 或 validate(['rule' => ...]) 全部被移除。验证逻辑已完全解耦到独立的验证器类。
迁移时得重写验证逻辑:
立即学习“PHP免费学习笔记(深入)”;
- 新建验证器类,如
appalidateUserValidate,继承hinkValidate - 在模型中用
$this->validate(new UserValidate())显式绑定(TP8.0.10+ 支持) - 老项目若大量用
validate(true),别试图兼容——TP5 的验证规则语法(如['require', 'email'])在 TP8 中部分不兼容,比如in规则现在要求传数组而非逗号字符串
TP8 路由定义里 Route::get('user/:id', 'index/user/read') 找不到控制器
TP8 默认关闭了「模块/控制器/操作」式 URL 解析,index/user/read 这种字符串路由地址已不被识别,会提示 Controller not exists: indexuserRead。
必须改用闭包、类方法数组或注解路由:
- 最简方案:用数组形式
Route::get('user/:id', ['app\controller\User', 'read']),注意命名空间和大小写 - 推荐用注解路由:在
User控制器类上加@route('user/:id', 'GET'),并启用注解支持(需安装topthink/think-annotation) - 如果沿用传统路由文件,确保
app/route/app.php中没有残留 TP5 风格的use thinkRoute;—— TP8 路由类是hink outeRule,静态方法入口统一走hinkRoute门面
TP5 的 config('database') 在 TP8 里读不到自定义配置项
TP8 引入了配置预加载机制,config() 默认只加载核心配置(app、database 等),你放在 app/config/ 下的自定义文件(比如 wechat.php)不会自动合并进配置池。
必须显式加载:
- 在
app/common.php或服务提供者中手动加载:config(require app_path() . 'config/wechat.php'); - 更规范的做法:在
app/provider.php中注册配置服务提供者,或直接在app/bootstrap.php开头加载 - 注意路径变化:TP5 的
CONF_PATH常量在 TP8 中已废弃,一律用app_path()或config_path()
迁移中最容易卡住的其实是配置加载顺序和验证器绑定方式——这两处没改对,其他地方再顺也跑不起来。



















