Laravel 11 彻底重构中间件注册机制:全局/分组中间件统一移至 bootstrap/app.php 的 withMiddleware() 中配置,路由中间件须显式 alias,中间件组改为方法调用,限流策略同步收口至 withRateLimiting()。

Laravel 11 彻底重构了中间件注册机制,核心变化是配置收口、显式声明、取消自动映射,而 Laravel 10 仍沿用 Kernel.php 驱动的传统模式。升级时若未调整注册逻辑,路由中间件会静默失效或直接报错。
全局中间件注册位置不同
Laravel 10 全局中间件写在 app/Http/Kernel.php 的 $middleware 数组里;Laravel 11 已移除该文件,全部统一到 bootstrap/app.php 的 withMiddleware() 闭包中:
- Laravel 10:
protected $middleware = [\App\Http\Middleware\TrustProxies::class, ...]; - Laravel 11:
$middleware->use([\App\Http\Middleware\TrustProxies::class]); - web/api 中间件组也改为方法调用:
$middleware->web([...])和$middleware->api([...]),不再通过$middlewareGroups配置
路由中间件必须先 alias 再使用
Laravel 10 支持在 Kernel.php 的 $routeMiddleware 中定义别名后直接调用,如 ->middleware('auth');Laravel 11 不再识别该数组,所有路由中间件必须显式 alias:
- Laravel 10:
protected $routeMiddleware = ['auth' => \App\Http\Middleware\Authenticate::class]; - Laravel 11:
$middleware->alias('auth', \App\Http\Middleware\Authenticate::class);必须出现在bootstrap/app.php中 - 未 alias 的类全名(如
\App\Http\Middleware\Authenticate::class)不能直接传给->middleware(),否则抛出 “Undefined middleware”
中间件组不再是魔法字符串
Laravel 10 中 ->middleware('web') 是靠 $middlewareGroups 映射实现的;Laravel 11 中它只是执行链入口,实际展开为 $middleware->web() 所注册的中间件列表:
-
->middleware('web')在 11 中等价于手动展开该组内所有中间件 - 不支持把带参数的中间件(如
throttle:60,1)塞进web()或api()调用里,只能单独加在路由上 - 多个中间件组合时顺序敏感,例如
['auth:sanctum', 'throttle:api']必须把认证放前面,否则请求绑定失败
速率限制器注册方式同步收紧
虽然不属于中间件本身,但限流中间件(throttle:xxx)的行为变化与注册机制强相关:
- Laravel 10:限流规则写在
app/Providers/RouteServiceProvider.php的configureRateLimiting()方法中 - Laravel 11:全部移入
bootstrap/app.php的withRateLimiting(),且只允许一个RateLimiter::for()注册点 - 未显式覆盖时,
throttle:api和throttle:web会强制启用默认策略(60次/分钟),不能靠“不配就不管”来绕过


















