必须先确认PHP≥8.2并移除deprecated的Facade和辅助函数;升级前需执行三步强制检查:确认Laravel为10.x最新版、卸载sanctum/telescope/pint、删除重复注册的EventServiceProvider;再更新composer.json中框架和PHP版本约束,重写cache.php移除Redis的'connection'键;控制器中删除DispatchesJobs trait,修正Route::view()空视图校验及中间件数组语法;队列配置需添加??'database' fallback并重建jobs表。

将 Laravel 10 项目升级到 Laravel 11,必须先确认 PHP 版本 ≥ 8.2,且已移除所有被标记为 deprecated 的 Facade 和辅助函数调用,否则 composer update 会因依赖冲突或运行时错误中断。
升级前强制检查项
第一步:运行 php artisan about,确认当前 Laravel 版本为 10.x 最新版(10.48.15 或更高),避免跨多个小版本直接升级。
第二步:执行 composer remove laravel/sanctum laravel/telescope laravel/pint,【Laravel 11 不再默认包含这些包,必须显式安装】,否则后续 artisan 命令会报 Class not found。
第三步:检查 config/app.php 中是否存在 'providers' => [] 数组内手动注册的 App\Providers\EventServiceProvider::class,Laravel 11 已将其设为自动发现,重复注册会导致事件监听器绑定两次。
核心配置迁移
方法一:更新 composer.json
将 "laravel/framework": "^10.0" 替换为 "laravel/framework": "^11.0",同时把 "php": "^8.1" 改为 "php": "^8.2"。不改 PHP 版本约束会导致 composer 安装失败并提示 “your php version does not satisfy that requirement”。
方法二:重写 config/cache.php
删除整个 'stores' => ['redis' => [...]] 块中 'connection' 键,Laravel 11 Redis 缓存驱动不再接受该配置项,保留会导致 Cache::store('redis')->get() 返回 null 而不报错,极难排查。
路由与控制器变更
① 打开 app/Http/Controllers/Controller.php,删除顶部 use Illuminate\Foundation\Bus\DispatchesJobs; 这行——该 trait 已从框架中彻底移除,保留会触发 Fatal error。
② 检查所有使用 Route::view() 的路由定义,确保第二个参数(视图名)不为空字符串或仅含空格,Laravel 11 对此做了严格校验,传入非法值将抛出 InvalidArgumentException。
③ 将 routes/web.php 中所有 Route::middleware(['auth'])->group(...) 结构,改为 Route::middleware('auth')->group(...),去掉中括号——新版本中间件数组语法仅支持单个中间件字符串,多中间件必须用 ->middleware(['auth', 'verified']) 显式声明。
队列与任务处理
打开 config/queue.php,找到 'default' => env('QUEUE_CONNECTION', 'sync') 这一行,在 env() 调用后追加 ?? 'database',因为 Laravel 11 默认队列连接不再 fallback 到 sync,未设置环境变量时会直接报错“Queue driver [null] is not supported”。
运行 php artisan queue:table 生成新队列表结构,旧版 jobs 表字段已被重构,不重建表会导致 dispatch() 写入失败且无明确错误提示。


















