可行,但必须严格按路径执行:先确保项目已在laravel 10.x稳定运行且php为8.2.2或8.3.22(禁用8.4.x),再切换composer镜像源、更新依赖(含--with-all-dependencies)、迁移启动逻辑至bootstrap/app.php、修正废弃api与配置,最后全面测试并补全限流等缺失项。

从 Laravel 10 升级到 Laravel 11 是可行的,但必须严格按路径执行,跳过中间版本或忽略环境约束会导致依赖解析失败、服务启动崩溃或静默降级。
前置检查:PHP 版本与当前框架状态
升级前务必确认两点:当前项目是否已在 Laravel 10.x 稳定运行;PHP 是否为 8.2.2 或 8.3.22(禁用 8.4.x,因其稳定性策略与部分依赖如 fruitcake/php-cors 冲突)。运行以下命令验证:
-
php artisan --version—— 确保输出类似Laravel Framework 10.48.17 -
php -v—— 输出应为PHP 8.2.2或PHP 8.3.22 -
composer outdated "laravel/*"—— 检查 sanctum、telescope 等是否已升至兼容版本(如 sanctum 必须 ≥ ^4.0)
环境准备:镜像源与分支隔离
阿里云 Composer 镜像会过滤 dev/unstable 包,而 Laravel 11 安装过程中可能依赖 laravel/tinker ^2.10.1 等尚未打正式标签的版本。临时切换源可避免“找不到匹配包”错误:
- 切腾讯镜像:
composer config -g repos.packagist composer https://mirrors.tencent.com/composer/ - 或回官方源:
composer config -g repo.packagist composer https://packagist.org - 用 Git 创建独立升级分支:
git checkout -b upgrade-to-11 - 完整备份三样东西:
composer.lock、config/目录(尤其config/app.php和.env)、数据库 dump 文件
更新依赖:两种安全方式任选其一
推荐使用一键命令,它自动处理依赖树重算,比手动改 composer.json 更少出错:
-
方法一(推荐):
composer require laravel/framework:^11.0 laravel/sanctum:^4.0 nunomaduro/collision:^8.1 spatie/laravel-ignition:^2.4 --update-with-all-dependencies -
方法二(手动):修改
composer.json中"php"为"^8.2","laravel/framework"为"^11.0",再运行composer update --with-all-dependencies
⚠️ 注意:--with-all-dependencies 不可省略,否则 illuminate/* 子包可能被锁在旧版,引发 Facade 找不到、中间件注册异常等静默崩溃。
结构迁移与代码修正:关键变更点
Laravel 11 将启动逻辑全部收口到 bootstrap/app.php,旧文件不再自动加载。漏写或顺序错,服务直接起不来:
-
bootstrap/app.php成唯一入口:需手动注册中间件、路由、服务提供者。例如:$app->withMiddleware(function (Middleware $middleware) { $middleware->web(append: [EnsureEmailIsVerified::class]); }); - 路由默认只加载
routes.php;若仍用routes/web.php和routes/api.php,需在bootstrap/app.php中显式require并调用Route::middleware('web')->group() -
config/app.php中若保留App\Providers\AppServiceProvider::class,会报Provider already registered—— Laravel 11 已自动注册标准提供者 -
Response::json()已废弃,改用response()->json();隐式模型绑定变严格,Route::apiResource('posts', PostController::class)中show(Post $post)仅接受整数 ID,字符串 ID 需在模型中声明$keyType = 'string'或改用显式查询
上线前必验:测试与限流补位
升级后不报错 ≠ 功能正常。这些变更不会抛异常,但会在生产环境暴露问题:
- 运行全部测试:
php artisan test或vendor/bin/phpunit,确保 baseline 是绿的 - API 限流默认被移除:
$middlewareGroups['api']中不再含\Illuminate\Routing\Middleware\ThrottleRequests::class . ':api',需手动加回,或按需在路由上加throttle:60,1(单位是分钟,不是秒) - 新建迁移中时间戳字段默认加
->default(now()),老表在 MySQL 5.7 或 SQLite 下执行php artisan migrate可能失败,需提前检查并调整











