如何将Laravel项目依赖从PHP 8降级适配PHP 7.4运行环境
核心前提说明
Laravel 9 框架本身最低运行要求就是 PHP 8.0.2,不存在任何黑科技可以在不降级 Laravel 框架版本的前提下,让你当前这套依赖直接跑在 PHP 7.4 上。手动匹配兼容 PHP 7.4 的依赖版本是唯一可行的路径,本质是将项目整体从 Laravel 9 降级到最后一个兼容 PHP 7.4 的 Laravel 8 LTS 版本,所有配套依赖都要对应调整到适配 Laravel 8、兼容 PHP 7.4 的版本区间。
注意:不要尝试用
--ignore-platform-req=php参数绕过 composer 的版本校验强行安装高版本依赖,哪怕安装成功,框架和依赖包内部大量使用 PHP 8 专属语法,运行时会直接抛出致命解析错误,完全无法正常使用。
具体依赖调整方案
直接按下面的版本约束修改 composer.json 里的 require 和 require-dev 配置,所有版本均为同时兼容 Laravel 8 和 PHP 7.4 的稳定版:
生产依赖(require块)
php: 调整为"^7.4|^8.0"laravel/framework: 调整为"^8.75"(Laravel 8 最后一个稳定维护版本,安全补丁覆盖最全)barryvdh/laravel-debugbar: 调整为"^3.5"fruitcake/laravel-cors: 保留原"^2.0.5"约束即可,该版本区间本身兼容 PHP 7.4guzzlehttp/guzzle: 调整为"^7.0.1",避开7.2以上仅支持PHP8的高版本intervention/image: 保留原"^2.7"约束即可,本身兼容 PHP 7.4laravel/sanctum: 调整为"^2.11"laravel/tinker: 调整为"^2.6"(2.7及以上版本要求PHP8)laravel/ui: 调整为"^3.3"(3.4及以上版本仅适配Laravel9)laravelcollective/html: 调整为"^6.2"(6.3及以上版本要求Laravel9+PHP8)
开发依赖(require-dev块)
brianium/paratest: 调整为"^6.2"(6.4及以上版本要求PHP8)fakerphp/faker: 保留原"^1.9.1"约束即可,本身兼容 PHP 7.4laravel/sail: 调整为"^1.13"(1.14及以上版本要求PHP8)mockery/mockery: 保留原"^1.4.4"约束即可,本身兼容 PHP 7.4nunomaduro/collision: 调整为"^5.11"(v6及以上版本要求Laravel9+PHP8)pestphp/pest-plugin-laravel: 调整为"^1.1"(1.2及以上版本要求PHP8)pestphp/pest-plugin-parallel: 要么直接移除该依赖,要么调整为"^0.3.1"(1.0及以上版本仅支持PHP8)phpunit/phpunit: 保留原"^9.5.10"约束即可,9.5系列本身兼容 PHP 7.4spatie/laravel-ignition: 直接替换为"facade/ignition": "^2.17",这是Laravel8默认的错误页面包,功能和laravel-ignition完全对齐(laravel-ignition从第一个版本开始就要求PHP8+Laravel9,没有兼容PHP7.4的版本)
后续操作步骤
- 修改完composer.json后,直接删除项目根目录下的
composer.lock文件和整个vendor文件夹,避免残留的高版本依赖干扰安装 - 先执行
composer install --no-dev安装生产依赖,确认没有版本冲突后,再执行composer install安装全量依赖 - 依赖安装完成后,执行
php artisan view:clear、php artisan config:clear、php artisan route:clear清理所有框架缓存
必须处理的代码兼容问题
光调整依赖版本不够,还需要手动修正项目代码里的不兼容内容:
- 把所有PHP8专属语法改回PHP7.4兼容写法:包括枚举、readonly属性、match表达式、命名参数、mixed类型声明、仅PHP8支持的联合类型、箭头函数引用传参等,这类语法会直接导致PHP7.4解析失败
- 修正Laravel版本差异带来的用法变更:Laravel9新增的路由枚举绑定、Str/Arr辅助函数新方法、邮件组件新语法、队列配置新字段等如果在业务代码里用到,要改回Laravel8对应的实现方式
- 排查业务代码里调用的第三方依赖高版本专属方法,对应调整为兼容版本的用法
- 全量跑一遍项目的自动化测试,手动走一遍核心业务流程,排查遗漏的兼容问题
内容的提问来源于stack exchange,提问作者Naser Nikzad
相关产品推荐
相关产品推荐

