laravel 11主动精简结构,移除app/http/controllers、config/等默认目录,路由统一为routes.php,中间件与配置全收口至bootstrap/app.php,模型casts改用方法定义,服务提供者须显式注册。

你需要把旧 Laravel 项目迁移到 Laravel 11 的轻量级结构,但发现 app/Http/Controllers 目录没了、routes/web.php 找不到了、bootstrap/app.php 突然成了核心入口——这不是删错了文件,而是 Laravel 11 主动砍掉了默认骨架,所有“理所当然”的目录和配置现在都得你亲手声明。
目录结构精简:哪些目录被移除了
执行 laravel new myapp --version=11 创建的新项目里,以下目录默认不存在:
app/Http/Controllers、app/Http/Middleware、app/Providers、app/Exceptions、app/Console/Commands(除 Artisan 命令外)、config 文件夹(整个 config/ 目录被移除)。
这些不是“隐藏了”,而是彻底不生成。如果你依赖 App\Http\Controllers\HomeController 这类路径,直接运行会报错 Class "App\Http\Controllers\HomeController" not found。
旧项目升级时,不要手动创建这些目录再复制文件——php artisan upgrade 会按需补全,但前提是你的 AppServiceProvider::class 注册方式已适配新容器绑定逻辑。
路由统一入口:从多文件到单 routes.php
Laravel 11 废弃了 routes/web.php 和 routes/api.php 分离机制,全部合并进一个 routes.php 文件。
第一步:删除 routes/web.php 和 routes/api.php;
第二步:在 routes/ 目录下新建 routes.php,内容以 use Illuminate\Support\Facades\Route; 开头;
第三步:用中间件显式区分用途——Web 路由写 Route::middleware('web')->get('/', ...),API 路由必须写 Route::middleware('api')->get('/users', ...);
注意:Route::prefix('api') 不再自动挂载 api 中间件组,漏写 ->middleware('api') 会导致请求无法通过 CORS 或认证中间件。
中间件与内核逻辑迁移至 bootstrap/app.php
方法一:注册中间件组
打开 bootstrap/app.php,在 withMiddleware() 回调里声明 web 和 api 组:
$app->withMiddleware(function (Middleware $middleware) {<br> $middleware->group('web', [...]);<br> $middleware->group('api', [...]);<br>});
方法二:注册服务提供者
AppServiceProvider 不再自动加载 boot() 方法,必须显式调用:
$app->register(App\Providers\AppServiceProvider::class);
方法三:异常处理接管
若你自定义了 App\Exceptions\Handler,必须添加:
$app->withExceptions(function (Exceptions $exceptions) {<br> $exceptions->renderable(function (Throwable $e, $request) {<br> // 自定义渲染逻辑<br> });<br>});
模型属性转换改用 casts() 方法
旧写法:protected $casts = ['active' => 'boolean', 'meta' => 'array'];
新写法:删除 $casts 属性,在模型中新增 public function casts() 方法:
public function casts(): array<br>{<br> return [<br> 'active' => 'boolean',<br> 'meta' => 'array',<br> ];<br>}
这个改动是向后兼容的,但新项目必须用方法形式,否则 php artisan make:model User 生成的模型里不会包含 casts() 方法,后续扩展属性类型(如 enum、encrypted)将无法复用 Laravel 11 的 cast 解析器。
配置文件不再集中于 config/ 目录
第一步:删除整个 config/ 文件夹;
第二步:将 session、cache、queue 等配置项直接写入 bootstrap/app.php 的对应方法链中;
例如 session 配置要放进 withSession():
$app->withSession(function (Session $session) {<br> $session->driver('redis');<br> $session->lifetime(120);<br>});
第三步:第三方包(如 laravel/sanctum)的配置不再通过 config/sanctum.php 加载,改为在 bootstrap/app.php 中调用 withSanctum() 或直接传参给 $app->withMiddleware()。
如果仍保留 config/app.php 并在里面写 'providers' => [App\Providers\AppServiceProvider::class],Laravel 11 启动时会报错 Provider already registered —— 因为该数组已被废弃,服务提供者必须通过 $app->register() 显式注入。











