中间件参数不能在构造函数中接收,只能在handle()方法中通过第三个及之后的参数获取;因服务容器解析时$request尚未注入,构造函数无法接收动态值,路由需用冒号语法传参如'middleware-name:param1,param2'。

中间件参数不能在构造函数里接收,只能在 handle() 方法中通过第三个及之后的参数拿到。Laravel 在服务容器解析中间件时,$request 还没进来,构造函数根本收不到动态值——写 __construct($role) 会直接报错。
路由中用冒号语法传参
这是最常用的方式,格式是 'middleware-name:param1,param2':
- 单参数:
->middleware('role:admin')→$parameters = ['admin'] - 多参数:
->middleware('permission:edit,delete')→$parameters = ['edit', 'delete'] - 全限定类名也支持:
->middleware(App\Http\Middleware\EnsureRole::class . ':admin,support')
在 handle() 里正确接收和使用
handle() 方法签名必须包含 $parameters(可变参数或索引数组):
- 接收单个字符串:
public function handle($request, Closure $next, $role) - 接收多个值:
public function handle($request, Closure $next, ...$roles)或public function handle($request, Closure $next, $roles)(此时$roles是数组) - 注意:所有参数都是字符串,
'true'不等于true,需手动转换
想用路由参数?别在构造函数里取
比如要根据 {post} 模型判断权限,不能在 __construct() 里写 $post:
- 正确做法是在
handle()里调用$request->route()?->parameter('post') - 推荐加空安全操作符,避免路由没匹配时出错
- 如果依赖模型绑定,还可直接用
$request->route()?->parameter('post')?->author_id
闭包中间件适合固定配置
需要传运行前就确定的值(如配置项、开关),可用闭包 + use 绑定:
->middleware(function ($request, $next) use ($allowedRoles) { ... })-
$allowedRoles必须在闭包定义前存在,比如从 config 或常量读取 - 这种写法不支持不同路由传不同值,但轻量、无注册成本


















