tp8迁移需重写路由、模型、容器服务并升级php至8.0.2+,禁用zts及废弃函数;路由改用#[route]属性,模型须声明类型,服务依赖构造器注入,配置需显式加载。

直接升不了,TP6 到 TP8 不是 composer update 就能搞定的迁移,而是要重写路由、重适配模型、重配容器服务——PHP 8.0+ 的语法约束、Attribute 注解机制和类型系统已经深度嵌入 TP8 内核,任何跳过语法升级或依赖硬编码的“平滑”尝试,都会卡在 Parse error: syntax error, unexpected token "string" 或 Class 'thinkApp' not found。
PHP 版本与扩展必须先达标
TP8 强制要求 PHP ≥ 8.0.2,且禁用 mysql_* 等废弃函数。宝塔用户不能只改站点 PHP 版本下拉框,还要确认:
- 目标 PHP 版本已实际安装(进「软件商店」→「PHP管理」查状态,不是只点“设置”)
-
php -v输出中明确含8.0.2或更高,且无ZTS标识(TP8 不兼容 ZTS 模式) - 必需扩展已启用:
mbstring、pdo、json、openssl、ctype、xml;执行php -m | grep -E 'mbstring|pdo|json|ctype|xml'验证 - 若用 Redis 队列,
redis扩展版本需 ≥ 5.3.7(旧版不支持 PHP 8.0+ 的返回类型声明)
路由层必须重写为 Attribute 风格
TP8 彻底移除字符串路径路由和 route.php 数组定义,全部改用 PHP 8 属性(#[Route])驱动。原 TP6 的 Route::get('user', 'User::index') 会直接 404。
- 控制器方法前加
#[Route('GET /user')],类名需带完整命名空间,如#[Route('GET /user', 'app\controller\User@index')] - 资源路由不再用
Route::resource(),改用#[Resource('user')]并配合#[Middleware]显式绑定中间件 - 闭包路由必须转为独立命令类,继承
thinkconsoleCommand,并在config/console.php中注册 - 所有路由中间件取消全局配置,改用
#[Middleware('auth')]或构造函数内调用$this->middleware('auth')
模型与数据库操作需强类型对齐
TP8 的 Db 和 Model 返回值默认为对象而非数组,且验证规则、关联加载、软删除行为全部基于 PHP 8 联合类型推导,TP6 的数组条件写法会静默失效。
- 废除
where(['id' => 1]),统一改用闭包:where(fn ($query) => $query->where('id', 1)) - 模型属性必须声明类型,如
protected int $id;,否则toArray()可能丢字段 -
validate属性禁用闭包,改用ValidateRule类实例或#[Validate]属性注解 - 软删除字段(如
delete_time)必须显式标注#[SoftDelete],否则withTrashed()不生效 - 查询结果强制转数组需调用
->toArray(),->all()返回的是Collection实例
容器与服务注册方式彻底变更
TP8 移除 $this->app->make() 和 bind(),改用构造器属性提升 + 自动注入,手动注册服务若未更新,启动时直接抛 TypeError。
- 服务类构造函数参数必须带类型提示,如
public function __construct(private UserService $userService) - 自定义服务注册改用
app()->singleton(UserService::class, fn () => new UserService()),不能再用bindTo() - 插件类若仍用
new thinkContainer(),必须替换为thinkContainer::getInstance(),且确保其psr-4映射在composer.json中正确声明 -
config/console.php中的命令类必须使用完整命名空间,且继承自thinkconsoleCommand(不是thinkcommandCommand)
最易被忽略的是配置加载时机:TP8 在容器初始化前就解析 .env,但不会自动加载 config/ 下非默认文件(如 config/api.php),必须在 app/bootstrap.php 开头显式调用 Config::load('api'),否则 Config::get('api.timeout') 永远为 null。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











