必须逐版本升级:9→10→11,不可跳过10;先升PHP≥8.1,再改composer.json并运行composer update --with-all-dependencies;移除$dates、更新邮箱规则;用php artisan upgrade迁移结构;清缓存、跑测试、查日志验证。

将 Laravel 9 项目升级至 11 版本需严格遵循官方语义化版本路径,跳过 Laravel 10 会导致 PHP 兼容性断裂、核心类移除不可逆、artisan 命令失效,且无法通过 php artisan upgrade 自动迁移结构。
从 Laravel 9 升级到 Laravel 10
这一步必须先完成,否则后续无法启动 Laravel 11 所需的底层结构。
第一步:确认 PHP 版本 ≥ 8.1 —— Laravel 10 不再支持 PHP 8.0,若当前为 8.0.x,【必须先升级 PHP 环境】,否则 composer install 会直接失败并中断整个流程。
第二步:更新 composer.json 中所有 Laravel 相关包版本号,将 "laravel/framework": "^9.0" 改为 "laravel/framework": "^10.0",同时检查 "illuminate/*" 包是否全部指向 ^10.0;运行 composer update laravel/framework illuminate/* --with-all-dependencies。
第三步:移除模型中已弃用的 $dates 属性 —— 它在 Laravel 10 中被完全删除,保留会导致 Eloquent 实例化时报致命错误;改用 $casts 或 Carbon::parse() 显式处理时间字段。
第四步:校验邮箱验证规则 —— 将 'email' 验证规则替换为 'email:rfc,dns' 或 'email:rfc,strict',旧写法会被静默忽略,导致邮箱格式校验失效而不报错。
从 Laravel 10 升级到 Laravel 11
Laravel 11 引入全新轻量骨架,默认不包含 app/Http/Controllers、app/Providers 等传统目录,必须依赖 laravel-upgrade 工具执行结构迁移。
方法一:使用官方升级命令(推荐)
① 运行 composer require laravel-upgrade --dev 安装升级工具;
② 执行 php artisan upgrade —— 该命令会自动检测当前版本、生成结构变更补丁、重排目录、迁移配置文件,并提示你手动确认每项改动;
③ 删除 bootstrap/app.php 中废弃的 Application 实例化代码,Laravel 11 使用 bootstrap/app.php 返回匿名函数,不再返回 Application 实例;
④ 检查 config/app.php 中是否残留 'providers' 数组 —— Laravel 11 默认启用自动服务发现,手动注册的 Provider 若未声明 provides() 方法,会在启动时抛出 Class not found 错误。
方法二:手动迁移(仅限极简项目)
复制 Laravel 11 官方基础骨架的 bootstrap/、config/、app/ 结构覆盖现有目录 → 替换 composer.json 中 "laravel/framework": "^11.0" → 运行 composer update → 手动将旧模型、请求类、资源类等按新命名空间迁移至 app/Models、app/Http/Requests、app/Http/Resources;
【注意:此方式跳过 php artisan upgrade 的自动校验,极易遗漏中间件注册方式变更或事件监听器语法调整】
升级后必验环节
运行 php artisan config:clear && php artisan cache:clear 清除旧缓存 —— Laravel 11 的配置加载机制与前代不同,残留缓存会导致 APP_DEBUG=true 时仍显示空白页。
执行 php artisan test --stop-on-failure 运行全部 PHPUnit 测试 —— 重点观察 DatabaseTransactions trait 是否报错,Laravel 11 默认使用内存 SQLite 测试数据库,若测试中硬编码了 MySQL 特有语法(如 JSON_CONTAINS),会直接崩溃。
打开浏览器访问首页,检查是否出现 Target class [App\Http\Controllers\HomeController] does not exist —— 若出现,说明控制器未按 Laravel 11 要求移入 app/Http/Controllers 目录,或命名空间未更新为 App\Http\Controllers。
查看 storage/logs/laravel.log 最后 20 行,确认无 Call to undefined method Illuminate\Support\Facades\Artisan::call() 类错误 —— 此错误表明仍有代码调用已被移除的 Facade 方法,需定位并替换为对应 Contract 或辅助函数。


















