中间件仅负责请求拦截与预处理,不得涉及业务逻辑;控制器只解析输入、调用领域层、返回响应;auth中间件误加构造函数是典型越界;中间件执行顺序为全局→组→路由级→控制器级。

中间件只做请求拦截与预处理,不碰业务逻辑
中间件的唯一职责是检查、修改或终止请求流,比如验证登录状态、校验 token、记录访问日志。它不能调用模型、不渲染视图、也不应执行数据库操作或业务判断(如“用户是否有权限编辑这篇文章”这类逻辑应交由 Policy 或 Service 处理)。一旦你在 handle() 方法里写了 User::find() 或 return view(),就已越界。
控制器负责协调,但不承担复杂业务
控制器接收请求后,只做三件事:解析输入(如 $request->validate())、调用领域层(如 $this->articleService->publish())、返回响应(return response()->json() 或 return view())。它不该包含 if/else 分支去决定该查哪个表、不该拼接 SQL、也不该手动构造 JSON 结构。常见错误是把整个订单创建流程写在 OrderController@store 里——这会让测试困难、复用率低、且违反单一职责。
auth 中间件误加到控制器构造函数,是最典型越界
这是 Laravel 新手高频踩坑点:在 HomeController 的 __construct() 里写 $this->middleware('auth');,结果导致所有方法(包括 index() 和 read())都被强制登录保护。而根路径 / 和文章页 /read/{id} 本该匿名可访。正确做法是:要么在路由定义时按需附加中间件,例如 Route::get('/dashboard', [DashboardController::class, 'index'])->middleware('auth');;要么在控制器内用 except() 显式排除,如 $this->middleware('auth')->except(['index', 'read']);。
中间件组和路由级中间件优先于控制器级
Laravel 的中间件执行顺序是:全局中间件 → 中间件组(如 web)→ 路由级中间件 → 控制器构造函数中声明的中间件。这意味着你可以在 routes/web.php 里给某条路由单独加 ->middleware('throttle:60,1'),它会比控制器里声明的 auth 更早执行。但反过来,控制器里写的中间件无法被路由定义覆盖——它总是生效。所以除非整组方法都需要同一套守卫逻辑,否则别把中间件塞进 __construct()。











