thinkphp 6.0.16 升级到 8.0 是结构级迁移,需依次完成环境统一(php≥8.0)、依赖重装、目录结构调整、路由与中间件重写、orm 行为修正及配置插件适配。

ThinkPHP 6.0.16 升级到 8.0 不是版本号替换,而是结构级迁移。TP8 是基于 PHP 8.0+ 的深度重构,必须按顺序处理环境、依赖、目录、配置、路由、ORM 和缓存等环节,缺一不可。
确认并统一 PHP 环境
TP8 要求 PHP ≥ 8.0.0,且 CLI 与 Web SAPI(如 php-fpm)版本和扩展必须完全一致:
- 运行
php -v查看 CLI 版本,建议使用 8.0.30、8.1.25 或 8.2.18 等长期支持小版本 - 在
public/下建info.php,内容为<?php phpinfo(); ?>,通过浏览器访问,核对顶部 PHP 版本、Loaded Configuration File路径是否与 CLI 完全相同 - 检查必需扩展:运行
php -m | grep -E 'mbstring|openssl|pdo|curl|zip|fileinfo|json',缺失则启用 - 若用宝塔或 PHPStudy,请切换至对应 NTS(非线程安全)版本,并重启 Web 服务与 php-fpm
重装依赖与更新 composer.json
不能用 composer update,必须清空后精准安装:
- 删除项目根目录下的
vendor/、composer.lock和runtime/ - 编辑
composer.json,将require区块替换为以下标准组合(注意版本号严格匹配):
"php": ">=8.0.0",
"topthink/framework": "^8.0",
"topthink/think-orm": "^3.0",
"topthink/think-view": "^2.0",
"topthink/think-filesystem": "^2.0"
}
- 执行
composer install --no-dev - 立即执行
composer dump-autoload -o(否则命令类和 Facade 加载失败)
调整目录结构与入口文件
TP8 彻底弃用 application/,统一为 app/ + config/ 扁平结构:
PHP 8.5.12 RC 1 候选版修复 BZ2、DOM、PDO、Opcache/JIT 和扩展内存安全问题,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
- 将原
application/目录重命名为app/,确保其下含controller/、model/、middleware/、route.php等标准子目录 - 所有配置文件(
database.php、app.php、cache.php等)移入config/根目录,禁止嵌套子目录 - 更新
public/index.php为 TP8 标准引导:
(new \think\App())->run()->send();
- 命名空间同步更新:原
application\index\controller\Index改为app\index\controller\Index,类内use think\Controller;删除,控制器默认继承think\controller\Base
重写路由与适配中间件
TP8 路由注册方式彻底变更,字符串式写法已废弃:
- 删除
app/route.php中所有Route::get('url', 'index/index')类型的旧写法 - 改用闭包或完整类方法数组,例如:
Route::get('index', [\app\controller\Index::class, 'index']); - 中间件不再通过
middleware.php全局注入,必须显式绑定:
→ 在路由中:Route::get('admin', 'admin/index')->middleware(\app\middleware\Auth::class);
→ 在控制器中:$this->middleware(Auth::class); - 若启用多应用模式,需在
app/multi.php中开启'app_multi' => true,并确保各应用的route.php独立定义
修正 ORM 行为与模型逻辑
TP8 的 think-orm ^3.0 对查询、软删除、验证等行为做了关键调整:
-
Db::table()->find()返回null?先执行php think optimize:schema生成字段缓存 - 软删除模型调用
find()不再自动过滤已删除记录,如需过滤,必须显式加->withTrashed(false)或使用->withoutTrashed() - 模型中禁用闭包形式的
validate属性,改用validate('UserValidate')或直接调用validate(true) -
save()操作必须明确指定更新状态:$user->isUpdate(true)->save()或$user->isUpdate(false)->save(),否则可能误判为新增 - 数据库配置中
'type' => 'mysql'必须小写,大写(如MySQL)会报Driver [MySQL] not supported
补全配置加载与插件适配
自定义配置和第三方插件需手动激活,不再自动识别:
- 原
config/api.php不会自动加载,需在应用启动前调用:Config::load('api', 'api'); - 插件类自动加载需检查
composer.json的autoload.psr-4是否映射到插件源码路径 - 容器调用统一改为
Container::getInstance(),$this->app->make()替换为$this->app->get() - 控制台命令(如自定义 migrate 或 export)必须在
config/console.php的'commands'数组中显式注册完整类名
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










