应分层归类中间件:按执行层级拆为Global/Web/Api/Domain子目录,用中间件组替代全局注册,删除未引用文件,重逻辑抽为服务类,并识别本不该存在的中间件。

中间件文件堆在 app/Http/Middleware 里超过 20 个,就该动手理了——不是删,是分层归类、按职责隔离、避免全局污染。
按执行层级把中间件分到不同目录
Laravel 默认只给一个 app/Http/Middleware 目录,但你可以手动拆出子目录,框架完全支持(只要命名空间对得上)。关键是让每个中间件的归属一目了然:
-
app/Http/Middleware/Global/:只放所有请求必经的底层中间件,比如TrustProxies、HandleCors、ValidatePostSize -
app/Http/Middleware/Web/:专用于web中间件组,含StartSession、VerifyCsrfToken、ShareErrorsFromSession -
app/Http/Middleware/Api/:专用于api组,如ThrottleRequests、EnsureFrontendRequestsAreStateful -
app/Http/Middleware/Domain/:业务相关中间件,比如CheckSubscription、RequireTwoFactor、CheckApiToken
改完目录后,别忘了同步更新命名空间,例如:App\Http\Middleware\Domain\CheckApiToken;再检查 app/Http/Kernel.php 中的类引用路径是否仍正确。
用中间件组替代零散注册
大量中间件直接塞进 $middleware 数组,不仅难维护,还会拖慢所有请求。真正该进全局数组的,通常不超过 5 个。其余一律收编进中间件组:
- 在
app/Http/Kernel.php的$middlewareGroups里定义web、api,再加一个admin组,把后台专用中间件(如RequireAdminRole、LogAdminAction)全塞进去 - 路由中统一用组名,而不是单个中间件名:
Route::middleware('admin')->group(...) - 避免在路由里反复写
->middleware(['auth', 'throttle', 'log.activity'])这种长列表,组名即契约
组内中间件顺序依然重要——比如 auth 必须在 RequireAdminRole 前面,否则未登录用户也会触发角色校验并报错。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
删掉没被引用的中间件文件
很多项目里躺着“写了一半就弃用”的中间件,比如 OldPermissionCheck.php、TempRateLimit.php,它们不在 Kernel.php 里注册,也不在任何路由中使用,纯属占位符:
- 先全局搜索文件名,确认它没被
use、没被class_alias、没在配置或注释里被提及 - 再运行
php artisan route:list --name=xxx配合grep检查是否绑定到某个路由 - 最后删文件 + 清缓存:
php artisan config:clear && php artisan route:clear
注意:别依赖 IDE 的“未使用类”提示——Laravel 的中间件常通过字符串名动态加载,静态分析会漏判。
中间件逻辑太重?拆成服务类
如果某个中间件的 handle() 方法超过 30 行,或者包含数据库查询、HTTP 调用、复杂条件分支,说明它已经越界了:
- 把核心判断逻辑抽成独立服务类,比如
App\Services\SubscriptionChecker,中间件只负责调用和决策转发 - 中间件本身应保持轻量:接收请求 → 调服务 → 返回响应或
$next($request) - 这样既利于单元测试(直接测服务类),也方便在控制器或其他地方复用同一套校验逻辑
真正的整理难点不在目录结构,而在于识别哪些中间件本不该存在——比如本该由策略(Policy)或表单请求(FormRequest)承担的权限/验证逻辑,硬塞进了中间件里。这类问题不解决,再多子目录也只是把混乱打包得更整齐。

















