Laravel 11 中间件别名必须在 bootstrap/app.php 的 withMiddleware() 中通过 $middleware->alias() 统一注册,不再支持 Kernel.php 的 $routeMiddleware;未注册则报“Undefined middleware”错误。

在 Laravel 11 中,中间件别名(alias)必须统一在 bootstrap/app.php 文件中注册,不再支持旧版在 app/Http/Kernel.php 的 $routeMiddleware 数组里直接配置。这是 Laravel 11 的关键变更,跳过这步会导致“Undefined middleware”错误。
在 bootstrap/app.php 中注册别名
打开 bootstrap/app.php,找到 withMiddleware() 方法,在闭包内调用 $middleware->alias(),传入关联数组:
- 键是你要使用的字符串别名(如
'auth'、'role'),不能含空格或特殊字符,避免与内置别名冲突 - 值是中间件类的完整命名空间路径(如
\App\Http\Middleware\Authenticate::class)
示例:
->withMiddleware(function (Middleware $middleware) {
$middleware->alias([
'auth' => \App\Http\Middleware\Authenticate::class,
'role' => \Spatie\Permission\Middleware\RoleMiddleware::class,
'permission' => \Spatie\Permission\Middleware\PermissionMiddleware::class,
'check.age' => \App\Http\Middleware\CheckAge::class,
]);
})别名注册后才能在路由或控制器中使用
注册完别名,才可在路由定义或控制器中通过字符串引用该中间件:
- 路由层:用
->middleware('auth')或->middleware(['auth', 'role:admin']) - 控制器构造器:用
$this->middleware('permission:edit posts') - 注意:未 alias 的类全名(如
\App\Http\Middleware\Authenticate::class)不能直接传给->middleware(),会报错
常见错误排查
如果中间件不生效,优先检查以下三点:
- 是否漏掉
bootstrap/app.php中的alias()注册?这是 Laravel 11 的强制要求 - 别名键名是否拼写一致?大小写敏感,且不能有前导/尾随空格
- 中间件类文件是否存在、命名空间是否正确、是否已运行
composer dump-autoload(极少需手动,但重命名类后建议执行)
不支持在 Kernel.php 中注册别名
Laravel 11 移除了 app/Http/Kernel.php 中的 $routeMiddleware 数组作用。即使你在那里添加了映射,也不会被识别——框架只读取 bootstrap/app.php 的 alias() 配置。全局中间件(如 TrustProxies)仍可放在 Kernel.php 的 $middleware 数组中,但那属于另一类注册方式,和别名无关。











