Laravel 10.x是LTS版本,强调稳定与渐进增强;11.x是现代化精简版,重构结构、提升类型约束、强制PHP≥8.2,并移除历史依赖与配置文件。

Laravel 10.x 和 11.x 不是简单的“小步迭代”,而是定位迥异的两个主版本:10.x 是长期支持(LTS)版本,强调稳定、兼容与渐进增强;11.x 是面向现代化开发的“精简+提速”版本,主动移除历史包袱、重构默认结构、提高类型与运行时约束。升级不是改个版本号的事,跳过 10.x 直升 11.x 几乎必然失败,且必须满足 PHP ≥ 8.2 的硬性前提。
PHP 与底层依赖要求更严格
两者均放弃 PHP 7.x,但门槛持续抬高:
- Laravel 10.x 要求 PHP 8.1+,可安全使用枚举、
readonly属性、array_key_first()等特性 - Laravel 11.x 强制 PHP 8.2+,启用更严格的类型检查,并原生支持
Random\Randomizer、new Stringable等新类 - 11.x 移除了对
ramsey/uuid的默认依赖,转而使用 PHP 8.2 原生 UUID 支持(需启用ext-uuid扩展)
项目结构与启动流程彻底重构
11.x 的最大变化之一是“收口”——将原本分散的关键入口统一到 bootstrap/app.php:
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
- 默认删除
app/Http/Kernel.php和app/Console/Kernel.php,中间件注册全部移入withMiddleware()闭包 - 不再生成
config/cors.php、config/broadcasting.php等独立配置文件,相关设置合并进config/app.php或由环境变量驱动 - 路由默认从
routes/web.php+routes/api.php合并为单文件routes.php;若仍需分拆,须手动require并显式调用Route::middleware('web')->group() -
RouteServiceProvider被移除,路由绑定逻辑直接写在bootstrap/app.php的withRouting()闭包中
路由、模型与开发工具链升级明显
功能增强路径不同,但都更强调表达力与开箱即用:
- 10.x 新增
Route::singleton()、支持枚举参数约束(->where('status', PostStatus::class))、withTrashed()模型绑定等渐进式能力 - 11.x 引入
->withRouting()配置块,支持模块化路由加载(--module),并默认启用带密钥鉴权的健康检查端点/up -
php artisan make:model -m在 11.x 中自动连带生成工厂(Factory)和填充器(Seeder);10.x 需显式加--factory和--seed - 10.x 已弃用的
$dates属性、array_*辅助函数,在 11.x 中彻底不可用,必须改用$casts和Arr::*静态方法
升级过程中的高频静默陷阱
这些变更往往不报错,但上线后立刻出问题:
- 时间戳字段默认加了
->default(now()),老表在 SQLite 或 MySQL 5.7 以下执行迁移会失败,提示Invalid default value for 'created_at';解决办法是临时去掉该默认值,或改用useCurrent() -
Route::apiResource()的隐式绑定变严格:旧版/api/posts/abc可能进入show(Post $post),升级后直接返回 404;需检查模型$primaryKey类型是否与数据库字段一致 -
Response::json()已废弃,但response()->json()仍可用;全局搜索项目中残留的Response::调用并替换 -
config/app.php中若还保留App\Providers\AppServiceProvider::class,会报Provider already registered—— 11.x 已自动注册标准提供者

















