跳转到主要内容
Laravel 11 以「Slim Application Skeleton」为名,大幅调整了应用结构。当你中途加入一个仍以旧结构升级的项目,或以 Laravel 10 及更早的书籍、教程学习时,容易感到困惑。本文汇总的正是 Laravel 11 发布时在 Laracasts 论坛和 Stack Overflow 上最常被问到的问题。
本 FAQ 面向新项目(Laravel 11 及以上)。既有项目的升级步骤请参考迁移指南
新结构从项目中删除了变更频率较低的 config 文件,这些文件转而使用框架内的 config/项目侧的 config/ 与框架侧的 config/ 会进行合并,以项目侧为优先。只有在需要自定义时才创建对应文件,即可生效。
在 Laravel 11 的新结构中,App\Http\Controllers\Controller 是一个空类,不再继承 Illuminate\Routing\Controller,也不再使用 ValidatesRequests / AuthorizesRequests trait。参考:Laravel 10 的 Controller vs Laravel 11 的 Controller替代方案:
如果使用频繁,也可以把 App\Http\Controllers\Controller 恢复为 Laravel 10 的样式。
新结构中 app/Http/Kernel.php 已被废弃,中间件配置改在 bootstrap/app.phpwithMiddleware() 中进行。
自定义中间件文件本身仍然创建在 app/Http/Middleware/ 目录中。
$this->middleware()Illuminate\Routing\Controller 的功能,新结构的空基类 Controller 中不可用。请改为实现 HasMiddleware 接口并定义 middleware() 方法。
Laravel 13 以后也可以使用 #[Middleware] 属性。
参考:Controller 中间件
authorizeResource() 依赖 AuthorizesRequests trait,因此在新结构的空基类 Controller 中不可用。有几种应对方式。1. 把基类 Controller 恢复为 Laravel 10 的形式(最简便)
这样就可以使用 $this->authorizeResource()2. 在每个方法上添加 Laravel 13 的 #[Authorize] 属性
新结构中 app/Console/Kernel.php 已被废弃,Schedule 的配置位置也发生了变化。routes/console.php 中定义(推荐):
bootstrap/app.php 中定义:
新结构废弃了 EventServiceProvider,事件与监听器的手动注册不再必需。自动注册的机制: 只要监听器类的 handle() 方法参数上以类型声明指定了事件类,即可自动注册。
如果需要手动注册,可以在 AppServiceProvider::boot() 中处理。
新结构中,ServiceProvider 的清单管理从 config/app.php 迁移到了 bootstrap/providers.php
使用 artisan make:provider 创建的 Provider 会自动追加到此文件中。
新结构中 app/Exceptions/Handler.php 已被废弃,异常处理的配置改在 bootstrap/app.phpwithExceptions() 中进行。
路由的自定义在 bootstrap/app.phpwithRouting() 中进行。添加路由文件:
完全接管(与 Laravel 10 的 RouteServiceProvider 相同):指定 using 后,Laravel 默认的路由注册将完全被禁用,你可以自行控制所有路由。
config/app.php 添加 providers 键后,会与框架内的 config/app.php 合并生效。
通过 replace() 方法可以将默认 Provider 替换为自定义实现。
从 Laravel 11 起,API 功能默认不再包含,如需使用可单独安装。
该命令会创建/配置以下内容:
  • routes/api.php
  • 用于 API 认证的 Laravel Sanctum 配置
  • 将 API 路由注册到 bootstrap/app.php
从 Laravel 11 起,广播功能默认也不再包含,如需使用可单独安装。
该命令会创建/配置以下内容:
  • routes/channels.php
  • Laravel Reverb 的安装配置
  • 广播的配置文件
请查看 bootstrap/app.php 的内容。Laravel 11 之后的新结构(或已迁移):
仍以 Laravel 10 之前的旧结构升级的项目:
形如 return Application::configure(... 就是新结构,否则就是仍以旧结构升级的项目。将旧结构项目迁移到新结构的步骤请参考迁移指南

相关页面

Laravel 11 之后的应用结构

详细讲解新应用结构的全貌以及 ApplicationBuilder 的内部实现。

旧结构到新结构的迁移指南

讲解从 Laravel 10 的旧应用结构迁移到 Laravel 11 之后新结构的步骤。
最后修改于 2026年7月18日