Laravel控制器构造函数中通过middleware()方法声明中间件,而非执行逻辑;可全局应用、按方法筛选(only/except)、传参、链式添加多个,顺序执行且共享上下文。

在 Laravel 控制器的构造函数中使用中间件,主要通过 middleware() 方法链式调用实现,而不是直接在构造函数里“执行”中间件逻辑。中间件实际是在请求生命周期中运行的,构造函数只是声明哪些中间件应被应用到该控制器或其部分方法上。
在控制器构造函数中全局绑定中间件
如果希望整个控制器的所有方法都经过某个中间件(比如认证),可在构造函数中调用 middleware() 并传入中间件名称:
public function __construct()
{
$this->middleware('auth');
}
这样,该控制器中所有 public 方法(包括 index、show、store 等)都会被 auth 中间件拦截校验。
对特定方法应用中间件
可以限制中间件只作用于某些方法,避免影响其他操作:
public function __construct()
{
$this->middleware('auth')->except(['index', 'show']);
// 或
$this->middleware('verified')->only(['edit', 'update']);
}
-
except()排除指定方法,其余全应用 -
only()仅对列出的方法启用中间件 - 方法名必须与控制器中定义的 public 方法名完全一致(大小写敏感)
传参给中间件
某些中间件支持参数(如权限检查中间件 can:edit,post),也可以在构造函数中传递:
public function __construct()
{
$this->middleware('can:update,App\Models\Post')->only(['edit', 'update']);
}
注意:参数需按中间件定义的规则书写,字符串形式传入;Laravel 会自动解析并注入对应模型实例(若启用了隐式路由模型绑定)。
多个中间件与顺序
可连续调用 middleware() 添加多个,执行顺序按添加顺序从左到右:
public function __construct()
{
$this->middleware('auth');
$this->middleware('throttle:api,60,1');
$this->middleware('signed')->only(['download']);
}
- 所有中间件共享同一个请求/响应上下文
- 若某中间件返回响应(如重定向或 403),后续中间件和控制器方法将不会执行
- 不建议在构造函数中做耗时操作或依赖请求数据(如
$request->input()),因为此时请求尚未进入中间件栈


















