Laravel 5.3 升级至 Laravel 9 正确操作步骤咨询
Laravel 5.3 升级到 Laravel 9 完整实操指南
核心前提
Laravel跨大版本升级必须逐步进行(5.3→5.4→5.5→…→8→9),不能跳版本。你的MacOS本地PHP8无法兼容Laravel5.3,所以第一步要先搭建临时兼容环境,再逐个版本升级。
第一步:搭建临时运行环境(适配Laravel5.3)
因为Laravel5.3依赖PHP5.6~7.0,本地PHP8无法直接运行,推荐两种方案:
- 方案1:Docker(推荐)
拉取PHP5.6-fpm镜像,配合Nginx或使用Laravel Sail自定义配置,快速搭建隔离环境,不用修改本地PHP版本。启动容器后进入项目目录,即可执行composer和artisan命令。 - 方案2:phpbrew安装PHP5.6
安装phpbrew后执行:
临时切换到PHP5.6版本来处理5.3→5.4的升级。phpbrew install 5.6.40 +default phpbrew switch php-5.6.40
第二步:逐步升级每个Laravel版本
每个版本升级前必须备份代码和数据库,升级后要验证项目能正常运行(页面、接口、artisan命令无报错),再进行下一个版本。
1. Laravel 5.3 → 5.4
依赖更新(修改composer.json)
{ "require": { "php": ">=5.6.4", "laravel/framework": "5.4.*", "appzcoder/crud-generator": "^2.1", "laravelcollective/html": "5.4.*", "doctrine/dbal": "^2.5", "maatwebsite/excel": "~2.1.0", "predis/predis": "~1.0", "guzzlehttp/guzzle": "~6.0", "laravel/scout" : "^3.0", "algolia/algoliasearch-client-php": "^2.2", "fx3costa/laravelchartjs": "^2.2", "gloudemans/notify": "^1.0", "pda/pheanstalk": "~3.1" }, "require-dev": { "fzaninotto/faker": "~1.4", "mockery/mockery": "0.9.*", "phpunit/phpunit": "~5.7", "symfony/css-selector": "3.2.*", "symfony/dom-crawler": "3.2.*" } }
执行composer update,解决依赖冲突(若某个包找不到兼容版本,先暂时移除或找替代包)。
代码调整
- 将
app/Http/routes.php的路由迁移到routes/web.php和routes/api.php - 替换废弃方法:
Input::get()→request()->input()或$request->input() - 检查
config/app.php中的服务提供者和别名,确保Collective HTML等组件配置正确。
2. Laravel 5.4 → 5.5
依赖更新
{ "require": { "php": ">=7.0.0", "laravel/framework": "5.5.*", "appzcoder/crud-generator": "^3.0", "laravelcollective/html": "5.5.*", "laravel/scout" : "^4.0" }, "require-dev": { "phpunit/phpunit": "~6.0" } }
切换到PHP7.0版本,执行composer update。
代码调整
- 启用服务自动发现:移除
config/app.php中已支持自动发现的包的服务提供者(如LaravelCollective\Html\HtmlServiceProvider) - 检查模型、控制器中是否使用了Laravel5.5废弃的API(如
DB::raw()的部分用法)。
3. Laravel 5.5 → 5.6
依赖更新
{ "require": { "php": ">=7.1.3", "laravel/framework": "5.6.*", "laravelcollective/html": "5.6.*", "maatwebsite/excel": "~3.0" }, "require-dev": { "phpunit/phpunit": "~7.0" } }
切换到PHP7.1版本,执行composer update。
代码调整
- 适配邮件系统变化:若使用自定义邮件模板,调整为Markdown格式或兼容新的邮件组件
- 清理旧的路由缓存:执行
php artisan route:clear。
4. Laravel 5.6 → 5.7
依赖更新
{ "require": { "laravel/framework": "5.7.*", "laravelcollective/html": "5.7.*", "laravel/scout" : "^5.0" } }
执行composer update。
代码调整
- 适配通知系统新增的数据库通知功能:若使用通知,更新通知类的写法
- 检查前端Mix配置,升级到兼容5.7的版本。
5. Laravel 5.7 → 5.8
依赖更新
{ "require": { "laravel/framework": "5.8.*", "laravelcollective/html": "5.8.*", "maatwebsite/excel": "~3.1", "laravel/scout" : "^6.0" }, "require-dev": { "phpunit/phpunit": "~7.5" } }
执行composer update。
代码调整
- 适配Carbon 2.x:检查项目中日期时间处理的代码,替换Carbon1.x的废弃方法
- 调整
Request::all()的用法:5.8中该方法默认不会包含未验证的字段,需显式传递参数。
6. Laravel 5.8 → 6.x
依赖更新
{ "require": { "php": ">=7.2", "laravel/framework": "^6.0", "laravelcollective/html": "^6.0", "guzzlehttp/guzzle": "^6.3 || ^7.0", "laravel/scout" : "^7.0" }, "require-dev": { "phpunit/phpunit": "~8.0" } }
切换到PHP7.2版本,执行composer update。
代码调整
- 移除路由命名空间:6.x默认移除了
RouteServiceProvider中的命名空间配置,需更新控制器路由的写法 - 适配独立组件:Laravel6将邮件、队列等组件拆分到独立包,检查依赖是否完整。
7. Laravel 6.x → 7.x
依赖更新
{ "require": { "php": ">=7.2.5", "laravel/framework": "^7.0", "laravelcollective/html": "^7.0", "laravel/scout" : "^8.0" }, "require-dev": { "phpunit/phpunit": "~8.5" } }
执行composer update。
代码调整
- 使用HTTP客户端:替换Guzzle的直接调用为Laravel7新增的
Httpfacade - 升级模型工厂:使用类工厂替代闭包工厂。
8. Laravel 7.x → 8.x
依赖更新
{ "require": { "php": ">=7.3", "laravel/framework": "^8.0", "laravelcollective/html": "^8.0", "laravel/scout" : "^9.0" }, "require-dev": { "phpunit/phpunit": "~9.0" } }
切换到PHP7.3+版本,执行composer update。
代码调整
- 适配路由缓存优化:执行
php artisan route:cache验证路由是否正常加载 - 使用
HasFactorytrait:模型需引入Illuminate\Database\Eloquent\Factories\HasFactorytrait来兼容新的工厂写法。
9. Laravel 8.x → 9.x
依赖更新
{ "require": { "php": ">=8.0.2", "laravel/framework": "^9.0", "laravelcollective/html": "^9.0", "laravel/scout" : "^10.0" }, "require-dev": { "phpunit/phpunit": "~9.5" } }
切换回本地PHP8版本,执行composer update。
代码调整
- 适配PHP8语法:添加属性类型声明、修复联合类型兼容问题
- 替换全局助手函数:将
str_*、array_*等全局函数替换为Str::*、Arr::*facade调用 - 检查Laravel9废弃的API,替换为新写法。
第三步:升级后优化
- 合并配置文件:每个版本升级都会新增或修改配置项,对比旧配置文件合并到新文件中
- 前端资源升级:将Laravel Mix替换为Vite(Laravel9推荐),更新前端构建流程
- 数据库优化:修复PHP8下的数据库查询兼容性问题(如严格模式下的字段类型)
- 运行单元测试:确保所有测试用例通过,验证业务逻辑正常。
内容的提问来源于stack exchange,提问作者WaqasRaza
相关产品推荐
相关产品推荐

