Laravel Gate调用时仅获取数组首个元素,原因是什么?
Laravel Gate 传递数组参数时仅接收首个元素的问题
问题代码
AuthServiceProvider.php 代码:
public function boot(): void { Gate::define('hasRole', function ($user, $roles) { dd($roles); return in_array($user->role_type, (array) $roles); }); }
控制器调用代码:
if (!Gate::allows('hasRole', ['Admin', 'Manager'])) { abort(403, 'Unauthorized'); }
执行dd($roles)时仅显示数组的首个元素Admin,请问这是什么原因?
原因及解决方法
原因
Gate::allows()方法的第二个参数如果传入数组,会被自动展开为参数列表。也就是说['Admin', 'Manager']会被拆成两个独立参数传递给Gate的闭包,而你的闭包只定义了$user和$roles两个参数,所以$roles只会拿到第一个元素Admin,第二个元素Manager会被丢弃。
解决方法
有两种可行的修复方式:
方式一:将数组嵌套包裹,作为单个参数传递
修改控制器中的调用代码,把数组放在另一个数组里,确保整个角色数组作为单个参数传给闭包:
if (!Gate::allows('hasRole', [['Admin', 'Manager']])) { abort(403, 'Unauthorized'); }
方式二:修改Gate闭包,使用可变参数接收
调整Gate的定义,用可变参数语法收集所有传入的角色参数,再合并为数组:
Gate::define('hasRole', function ($user, ...$roles) { // 将可变参数扁平化并转为数组 $roles = collect($roles)->flatten()->toArray(); return in_array($user->role_type, $roles); });
这种方式更灵活,无论你传入单个角色字符串还是多个角色的数组,都能正常处理。
内容的提问来源于stack exchange,提问作者vimuth
相关产品推荐
相关产品推荐

