不能直接备份换vendor升级。TP5.1到TP6.0.16是框架级重构,需结构适配、人工检查,否则启动失败或核心功能异常;备份须覆盖代码、数据、环境三方面,新环境须用composer拉取干净TP6并重写路由、验证器、模型等核心逻辑。

直接备份再换 vendor 目录就能升级?不行。TP5.1 到 TP6.0.16 是框架级重构,不是版本号 bump,跳过结构适配和人工检查,项目大概率启动失败或路由/验证/数据库全挂。
备份必须覆盖代码、数据、环境三块
只 tar czf 项目目录是假备份,runtime/ 和 public/static/ 里有缓存和生成文件,不排除会导致还原后行为异常;数据库没导出建表语句,迁移后连表都不存在;PHP 版本或扩展缺失,php think run 直接报错。
- 代码与配置:用
tar -czf tp51-backup-$(date +%Y%m%d).tar.gz --exclude='runtime/*' --exclude='public/static/*' /path/to/tp51 - 数据库:执行
mysqldump -u用户名 -p 数据库名 > tp51_db_$(date +%Y%m%d).sql,确认含CREATE TABLE和INSERT - 环境快照:记下
php -v输出、php -m | grep -E 'pdo|mbstring|openssl|curl|json|gmp|sodium'结果、Web 服务器类型及伪静态规则(Nginx 的try_files或 Apache 的.htaccess)
新 TP6 环境不能复用旧 vendor
TP6.0.16 要求 PHP ≥7.2(推荐 7.4+ 或 8.0+),且 gmp 和 sodium 扩展必须启用——尤其涉及 JWT 或加密时,缺一则 php think run 启动即崩。旧项目的 vendor/ 是为 TP5.1 编译的,硬塞进 TP6 会触发类找不到、方法不存在等致命错误。
- 用
composer create-project topthink/think tp6 --stability=stable拉官方干净 TP6 项目(自动含 6.0.16) - 确认
config/是扁平结构(TP6 不再支持config/database.php嵌套子目录,所有配置文件放根下) - 检查
public/index.php加载的是think\initializer\Boot,不是 TP5 的thinkphp/start.php
路由、验证器、模型这些核心必须重写
TP6 的 Route::get('user', 'index/user/index') 写法已废,app\common\validate\Login 命名空间也不认——不改就 404 或 Class not found。这些不是“改几个字符”,而是结构级替换。
- 路由:删掉旧
route/route.php全部内容,新建app/route.php,返回RuleGroup实例,目标地址必须写成[\app\controller\Index::class, 'index']或命名路由 +url('[index]') - 验证器:删
app\common\validate\*,执行php think make:validate Login生成新类,命名空间改为app\validate,$validate->getError()返回关联数组,前端需适配字段级错误结构 - 模型与 Db:
Db::name('user')改成Db::table('user'),Model::get()改成Model::find(),where('status', 'neq', 0)改成where('status', '', 0)
中间件、服务提供者、命令行指令全要重实现
TP5 的 thinkconsoleCommand 和 thinkmiddleware 接口在 TP6 里已废弃,继续用会报 “must implement ConsoleCommandInterface” 类错误。Loader::import() 这种手动加载方式也彻底失效,扩展类必须走 Composer PSR-4 自动加载。
- 中间件:类必须实现
thinkcontractMiddlewareInterface,handle()方法签名固定为public function handle(Request $request, Closure $next) - 服务提供者:新建类继承
thinkService,在register()里绑定服务,在app/provider.php中注册全名(如app\provider\MyServiceProvider::class) - 命令行指令:实现
ConsoleCommandInterface,configure()和handle()方法不可省略,handle()必须返回int
最易被忽略的是配置加载时机和 Session 初始化——TP6 默认不加载非预设配置(比如你自定义的 config/api.php),也不自动开启 Session,middleware.php 里漏加 \think\middleware\SessionInit::class,登录态就永远为空。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











