必须分步升级:先升至 Laravel 7,再升至 Laravel 8;需匹配 PHP ≥ 8.0,修复 serializeDate() 返回类型、Handler 签名、session 配置,迁移或兼容工厂,逐一处理 dcat-admin、jenssegers/agent 等扩展兼容性,并全面测试迁移、单元测试及核心功能。

从 Laravel 6 直升 Laravel 8 是一次跨大版本的升级,涉及 PHP 版本兼容性、核心组件重构、扩展包适配和语法调整。不能跳过中间版本直接升级,必须分步进行:先升至 Laravel 7,再升至 Laravel 8。整个过程需严格遵循官方迁移路径,并重点处理工厂、异常处理、会话配置、模型序列化及第三方扩展兼容性问题。
分阶段执行升级流程
必须按顺序完成两轮升级,不可跳步:
- 第一步:将 Laravel 6 升级到 Laravel 7
参照官方文档 Laravel 7 升级指南,修改composer.json中"laravel/framework": "^7.0",运行composer update,同步检查并更新所有依赖项(如phpunit/phpunit、fideloper/proxy等) - 第二步:将 Laravel 7 升级到 Laravel 8
再更新composer.json为"laravel/framework": "^8.0",运行composer update;此时若 PHP 版本低于 8.0,需先升级系统 PHP 至 8.0 或更高(Laravel 8 最低要求 PHP 8.0)
关键代码与配置调整
升级后常见报错多源于以下几处,需手动检查修复:
-
模型日期序列化:Laravel 8 强制要求
serializeDate()返回字符串,旧写法可能触发类型错误。统一改为:protected function serializeDate(DateTimeInterface $date): string { return $date->format($this->dateFormat ?: 'Y-m-d H:i:s'); } -
异常处理器:检查
app/Exceptions/Handler.php中的render()和report()方法签名是否匹配 Laravel 8 的新接口(例如参数类型、返回类型声明) -
Session 配置:确认
config/session.php中secure和http_only字段值为布尔型(true/false),而非字符串或未定义 -
Factory 工厂重构:Laravel 8 废弃全局
$factory->define()方式,推荐迁移到类式工厂。若暂不重构,可安装兼容包:composer require laravel/legacy-factories
第三方扩展兼容性处理
很多扩展在 Laravel 8 + PHP 8.1 下不再支持旧版本,需针对性处理:
- 使用
dcat-admin:升级时默认拉取最新版,若需回退,执行composer require dcat/laravel-admin:"2.1.7-beta"(替换为你原用的稳定版本号) - 使用
jenssegers/agent:PHP 8.1 下失效,建议替换为mobiledetect/mobiledetectlib,API 基本一致,仅需调整命名空间和实例化方式 - 使用 SleepingOwlAdmin:必须确保 Laravel 已为 8.x,然后更新
composer.json中"sleeping-owl/admin": "^8.0",并移除已废弃的laravelcollective/html,改用原生 HTML 或 Blade 组件 - 其他扩展:逐一验证是否支持 PHP 8.1 和 Laravel 8;不支持的老版本无法降级运行,只能更换或等待作者更新
测试与验证要点
升级完成后,不能只看首页是否能打开,需覆盖以下场景:
- 运行全部迁移:
php artisan migrate:fresh --seed,确认表结构创建无误、填充数据正常 - 执行单元测试和 Feature 测试,重点关注认证、授权、队列、文件上传、数据库事务等模块
- 手工验证后台管理界面(如有)、API 接口返回格式、分页、Eloquent 关联加载是否仍符合预期
- 检查日志、缓存、队列驱动是否仍正常工作(特别是 Redis 连接、Horizon 配置)


















