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
相关产品推荐
相关产品推荐

