Laravel 11.x 中中间件必须在 app/Http/Kernel.php 中注册,不再支持 bootstrap/app.php;全局中间件、中间件组和路由中间件分别通过 $middleware、$middlewareGroups 和 $routeMiddleware 属性配置。

在 Laravel 11.x 中,bootstrap/app.php 文件不再用于注册中间件。这是 Laravel 11 的一个重要变化:它彻底移除了该文件中手动注册全局中间件或中间件组的机制,转而采用基于 服务提供者 + HTTP 内核 的标准注册方式。
简单说:
✅ 中间件必须定义在 app/Http/Middleware/ 目录下;
✅ 全局中间件、中间件组、路由中间件,全部统一在 app/Http/Kernel.php 中配置;
❌ bootstrap/app.php 不再接受中间件注册逻辑,也不再加载中间件相关配置。
如何正确注册中间件(Laravel 11.x)
✅ 在 app/Http/Kernel.php 中注册
打开 app/Http/Kernel.php,你会看到三个关键属性:
-
$middleware:全局中间件(所有请求都经过,按顺序执行) -
$middlewareGroups:中间件组(如web、api) -
$routeMiddleware:可分配给单个路由或控制器的别名中间件
// app/Http/Kernel.php
protected $middleware = [
// 全局中间件(例如:TrustHosts、HandleCors)
\App\Http\Middleware\TrustHosts::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
];
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
\Illuminate\Routing\Middleware\ThrottleRequests::class . ':api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'admin' => \App\Http\Middleware\EnsureAdmin::class, // 自定义中间件示例
];? 提示:添加自定义中间件前,先用
php artisan make:middleware EnsureAdmin生成类,再将其加入上述任一数组即可。
❌ 不要尝试在 bootstrap/app.php 注册中间件
Laravel 11 的 bootstrap/app.php 仅负责:
立即学习“PHP免费学习笔记(深入)”;
- 创建应用实例(
new Application()) - 配置基础路径和环境
- 注册核心服务提供者(如
FoundationServiceProvider) - 返回
$app实例
它不处理 HTTP 层逻辑,也没有 $app->middleware() 或类似方法可用。任何试图在此处“手动添加中间件”的代码都会被忽略或报错。
✅ 路由中使用中间件的方式(保持不变)
// routes/web.php
Route::get('/admin', [AdminController::class, 'index'])->middleware('admin');
// 或使用中间件组
Route::middleware(['web'])->group(function () {
Route::get('/', [HomeController::class, 'index']);
});Laravel 11 强化了分层清晰性,HTTP 中间件生命周期完全交由 Kernel 管理,更利于测试与维护。把中间件逻辑塞进 bootstrap/app.php 不仅无效,还会让项目偏离官方约定。



















