laravel 7 升级至 8 需分步实施,涉及php≥7.3、依赖兼容性校验、工厂系统重构(类式工厂或兼容包)、安全更新命令及关键配置人工核查。

Laravel 7 到 8 的迁移不是简单改个版本号,而是涉及结构、语法和底层机制的实质性升级。核心在于工厂系统重构、PHP 版本要求提升、部分 API 废弃,以及对依赖包兼容性的重新校准。必须分步推进,跳过中间版本会导致 composer 报错或运行时异常。
确认基础环境与兼容前提
升级前务必验证以下三点:
- PHP 版本需 ≥ 7.3(Laravel 8 官方最低要求),但强烈建议使用 PHP 7.4 或 8.0,避免 Laravel 7 在 PHP 8.1+ 下已知的 Deprecated 报错干扰迁移过程
- 检查
composer.json中第三方包是否支持 Laravel 8:例如spatie/laravel-permission需 ≥ v3.17,laravel/tinker需 ≥ v2.5 - 备份
config/目录和.env文件——Laravel 8 升级脚本可能静默覆盖config/app.php中的 providers 和 aliases 配置
工厂系统必须重构或启用兼容层
这是 Laravel 8 最显著的变化。旧版闭包式工厂($factory->define())在 Laravel 8 中默认不可用。
- 若时间紧张,可先安装兼容包:
composer require laravel/legacy-factories,它让原有 factory 文件继续工作,争取缓冲期 - 长期方案是迁移到类式工厂:为每个模型新建
database/factories/UserFactory.php类,继承Illuminate\Database\Eloquent\Factories\Factory,实现definition()方法,并在模型中添加use HasFactory; - 关联调用从
factory(User::class)改为User::factory(),嵌套关系可用User::factory()->has(Post::factory()->count(3))
更新依赖与执行安全升级
不要直接运行 composer update,这会引发子包版本撕裂。
- 修改
composer.json中"laravel/framework": "^8.0",同时将"php"约束更新为"^7.3|^8.0" - 运行:
composer update "laravel/framework" "laravel/tinker" --with-all-dependencies,确保illuminate/*包版本统一 - 安装升级助手:
composer require laravel/upgrade --dev,再执行php artisan laravel:upgrade,它会自动修正app/Providers/RouteServiceProvider.php、bootstrap/app.php等骨架文件
关键代码与配置检查点
升级后必须人工核对以下易遗漏项:
-
App\Exceptions\Handler中的report()和render()方法签名未变,但需确认是否引用了已被移入新命名空间的类(如Illuminate\Validation\ValidationException位置未变,但部分辅助类路径有调整) - 所有
use Illuminate\Support\Facades\XXX仍有效,但Hash、Mail等 Facade 对应的底层实现类路径可能变化,不需改调用,但自定义扩展需检查 - 数据库迁移中若用到
foreignId(),Laravel 8 已全面支持,可替代旧式unsignedBigInteger('user_id')+foreign()组合











