可行,但必须严格按官方路径操作:确认php≥7.4、composer≥2.2,备份config和composer.lock,修改composer.json中laravel/framework为"^9.0"并运行composer update --with-all-dependencies,再用升级助手扫描、手动修复routeserviceprovider、缓存配置及外键约束等变更。

直接从 Laravel 8 升级到 Laravel 9 是可行的,但必须严格按官方路径操作——Laravel 9 是 8 的下一个主版本,升级过程有明确约束和关键变更点,跳过或忽略任一环节都可能引发运行时错误、中间件失效或配置静默丢失。
确认基础环境是否达标
Laravel 9 要求:
- PHP 版本 ≥ 7.4(推荐 8.0+,因 Laravel 9.3+ 已开始适配 PHP 8.1+ 特性)
- Composer 版本 ≥ 2.2(运行
composer self-update确保最新) - 项目中未使用已被标记为
@deprecated的类或方法(如旧版Illuminate\Support\Facades\Password的某些静态调用方式)
执行 php -v 和 composer --version 核对;若 PHP 过低,先升级 PHP 再继续。
备份与准备
这不是可选项,是强制前置动作:
- 用 Git 创建新分支:
git checkout -b upgrade-to-laravel-9 - 备份
config/目录全量内容(尤其app.php、auth.php、database.php) - 备份当前
composer.lock文件(重命名为composer.lock.bak) - 确保所有测试通过:
php artisan test或vendor/bin/phpunit,重点关注路由绑定、表单验证、队列任务序列化逻辑
修改依赖并更新核心包
编辑 composer.json:
- 将
"laravel/framework": "^8.0"改为"laravel/framework": "^9.0" - 更新 PHP 版本约束:
"php": "^7.4|^8.0"(若已用 PHP 8.1,可写"^7.4|^8.0|^8.1") - 移除或锁定第三方包版本,避免自动拉取不兼容版本,例如:
"spatie/laravel-permission": "^5.5"(对应 Laravel 9 兼容版)
然后运行:
composer update "laravel/framework" "laravel/tinker" --with-all-dependencies
加 --with-all-dependencies 可防止 illuminate/* 子包版本分裂(常见报错如 Class 'Illuminate\Support\Facades\Hash' not found 多源于此)。
应用变更并修复代码
升级后需手动处理几类高频问题:
- 运行升级助手:
composer require laravel/upgrade-helper --dev && php artisan upgrade:check,它会扫描废弃用法并提示修复位置 - 检查
app/Providers/RouteServiceProvider.php:Laravel 9 将路由加载逻辑移至bootstrap/app.php,该文件需按新结构重写(助手会自动替换) - 确认缓存驱动:Laravel 9 仍支持
file驱动,但若你已在用cache.store = file,注意config/cache.php中stores.file配置项已废弃,应改用array或redis - 外键约束默认禁用:在迁移中使用
Schema::create()时,外键不会自动生效,需显式添加Schema::enableForeignKeyConstraints();到up()方法末尾 - HTTP 客户端替代 cURL:建议将旧的
curl_init()调用统一改为Http::get(...)(需use Illuminate\Support\Facades\Http;)
最后清空配置缓存:php artisan config:clear && php artisan cache:clear,再启动服务验证。











