Laravel 8 升级到 11 必须逐版本进行(8→9→10→11),不可跳步;需确认 PHP ≥ 8.2,同步更新 composer.json 中框架及生态包版本,手动调整目录结构、工厂语法、中间件、Facades 与辅助函数,并验证第三方包兼容性。

从 Laravel 8 升级到 11 不是一步操作,必须按 8 → 9 → 10 → 11 逐主版本进行。官方不提供跳版指南,每个中间版本都有独立的升级文档和破坏性变更说明。
怎么查当前版本和目标版本的官方指南
运行以下命令确认你当前所用版本:
php artisan --version
输出如 Laravel Framework 8.83.27,说明你在 8.x 分支。接着访问对应版本的升级文档:
- Laravel 8 → 9:查阅 Laravel 9 升级指南
- Laravel 9 → 10:查阅 Laravel 10 升级指南
- Laravel 10 → 11:查阅 Laravel 11 升级指南
所有指南都位于 laravel.com/docs/{版本号}.x/upgrade,页面顶部明确标注“From X.x to Y.y”。
关键差异点(8 到 11 累计变化)
这些是跨多个版本逐步引入、且影响面广的核心变动:
- PHP 版本要求持续提升:8.x 支持 PHP 7.3+,而 11.x 强制要求 PHP ≥ 8.2
-
项目结构精简:Laravel 11 默认不再生成
app/Http/Controllers、app/Http/Middleware、app/Providers目录,改用函数式路由和按需加载 -
配置与服务提供者调整:config/app.php 中废弃的
'providers'数组项(如 PaginationServiceProvider)必须删除;AppServiceProvider 的register()和boot()逻辑需适配容器扩展方式 -
模型工厂语法变更:从类定义(
class UserFactory extends Factory)改为闭包写法,旧代码在 11 中直接报错 -
Facades 与辅助函数迁移:
str()、array_*等全局函数被弃用,统一改用Str::、Arr::命名空间调用 -
中间件与内核重构:HTTP 内核中
$middlewareGroups结构简化,web 组默认移除EncryptCookies等中间件,需手动补全
如何高效定位改动并验证
别靠人工逐行比对,用工具+检查清单快速落地:
- 安装升级助手:
composer require laravel/upgrade --dev,然后运行php artisan laravel:upgrade(支持 9→10→11) - 执行
composer update laravel/framework --with-all-dependencies,确保所有子依赖(如 symfony/*、doctrine/dbal、carbon)同步升级 - 重点检查并清理以下位置:
–config/app.php中过时的 providers
–app/Kernel.php中间件组定义
–database/factories下所有工厂文件语法
– 全局搜索str(、array_、$dates、Route::apiResource等关键词 - 运行测试前先清缓存:
php artisan config:clear && php artisan cache:clear && php artisan view:clear
第三方包兼容性不能忽略
很多崩溃不是框架本身导致的,而是生态包没跟上:
- 查看你使用的包是否声明支持 Laravel 11,例如:
–spatie/laravel-backupv8 支持 10,v9 才支持 11
–laravel/sanctum必须升至^4.0,并手动发布迁移:php artisan vendor:publish --tag=sanctum-migrations - 在
composer.json中显式锁定关键包版本,避免composer update拉入不兼容版本 - 若某包暂无 Laravel 11 支持,可临时 fork 并提交适配 PR,或降级该包功能以维持主流程可用


















