laravel 11 将中间件与路由统一收口至 bootstrap/app.php:删除 app/http/kernel.php,强制通过 withmiddleware() 显式声明 web/api 组,路由默认只加载 routes.php,废弃自动分组与隐式绑定。

Laravel 11 对中间件和路由的配置方式做了大幅收口和简化,不是小修小补,而是结构级重构。核心变化在于“统一入口、显式注册、默认精简”,Laravel 10 仍保留传统分层写法,兼容性优先;而 Laravel 11 要求你主动声明,不默认隐含任何行为。
中间件注册位置彻底迁移
Laravel 11 删除了 app/Http/Kernel.php,所有中间件注册必须在 bootstrap/app.php 的 withMiddleware() 闭包中完成:
- web 中间件组需显式调用
$middleware->web(append: [...]) - api 中间件组对应
$middleware->api(append: [...]) - 全局中间件直接写进
$middleware->use([...]) - Laravel 10 中通过
$middlewareGroups数组定义的分组,在 11 中已由框架内置,不再手动维护
路由定义全部收口到 bootstrap/app.php
不再依赖 RouteServiceProvider 或 routes/*.php 自动加载:
- 默认只加载单文件
routes.php(非web.php或api.php) - 若仍需拆分路由文件,必须手动
require并显式包裹在Route::middleware('web')->group(...)中 - 资源路由隐式绑定默认关闭,
Route::resource('posts', PostController::class)不再自动解析{post}→$post,需加->binding('post', Post::class) -
Route::apiResource()保持完全兼容,但控制器必须用--api生成,否则参数名或签名错误会导致模型绑定失败
配置合并导致的中间件行为差异
因 config/cors.php、config/broadcasting.php 等被移除,相关中间件行为受环境变量或 config/app.php 驱动:
- CORS 中间件(如
Fruitcake\Cors\HandleCors)仍可用,但配置项需从config/app.php的'cors'键或.env注入 -
'api'中间件组不再包含认证逻辑,auth:api仍是独立中间件,需显式添加 - 中间件执行顺序更敏感:Laravel 11 默认不保证组内顺序,链式调用如
->middleware(['throttle:api', 'auth:sanctum'])须严格按依赖关系排列
废弃与强制变更点
这些写法在 Laravel 11 中直接报错或失效:
-
App\Providers\AppServiceProvider::class若仍在config/app.php的'providers'中,会提示 “Provider already registered”——11 已自动注册全部标准提供者 -
Route::match(['GET', 'HEAD'], ...)不再自动注册 HEAD,必须显式写Route::head(...) -
$dates属性、array_*()辅助函数彻底移除,对应改用$casts和Arr::* - 控制器方法参数若带类型提示(如
show(Post $post)),Laravel 11 仍支持,但资源路由绑定只认参数名($post),不校验类型











