You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中如何向中间件传递并获取选项参数?

Laravel中间件获取控制器传递参数的正确方法

1. 控制器中传递参数的正确方式

在控制器构造方法里,给中间件传递参数时,需要将参数追加在中间件名称之后,用冒号分隔多个参数:

public function __construct()
{
    // 传递单个或多个字符串参数
    $this->middleware('contactpermissionschecker:canEdit,canDelete');
    
    // 如果要传递关联数组,先序列化再传递
    $accessArray = ['canEdit' => true, 'canDelete' => false];
    $this->middleware('contactpermissionschecker:' . json_encode($accessArray));
}

2. 中间件中接收参数的方法

中间件的handle方法,在$request和$next闭包之后的参数,就是控制器传递过来的参数:

  • 接收多个独立参数的场景:
public function handle(Request $request, Closure $next, ...$requiredAccess)
{
    // $requiredAccess 是包含canEdit、canDelete的数组
    if (!in_array('canEdit', $requiredAccess)) {
        abort(403, '无编辑权限');
    }
    
    return $next($request);
}
  • 接收序列化数组的场景:
public function handle(Request $request, Closure $next, $accessJson)
{
    $requiredAccess = json_decode($accessJson, true);
    
    if (!$requiredAccess['canEdit']) {
        abort(403, '无编辑权限');
    }
    
    return $next($request);
}

为什么之前的方式取不到参数

  • $request->requiredAccess:控制器传递的中间件参数不会自动存入请求对象,所以无法通过这种方式获取。
  • $this->options:中间件的$options属性并非用于接收控制器传递的自定义参数,它通常是中间件自身的配置项,因此也无法拿到你传递的requiredAccess数组。

内容的提问来源于stack exchange,提问作者rockstardev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 00:57:13