Laravel 10中如何为Policy的before()方法添加额外参数?
Laravel 10 Policy before方法添加额外参数的解决方案
Laravel的Policy before 方法支持接收额外参数,框架会自动将调用权限时传入的模型/参数传递给它,你只需要调整方法签名即可,具体实现如下:
正确的方法定义
如果你的Policy是专门绑定到School模型的,直接将School实例作为第二个参数传入即可:
public function before(User $user, School $school): ?bool { // 编写你的特定场景逻辑,满足条件时返回true if ($user->hasRole('super_admin') && $school->is_featured) { return true; } // 返回null表示继续执行后续的Policy方法(如view、update等) return null; }
兼容无模型场景的写法
如果该Policy可能被用于不需要传入School实例的权限检查,建议将第二个参数设为可选并做类型判断,避免报错:
public function before(User $user, mixed $model = null): ?bool { // 仅当传入的是School实例时执行逻辑 if ($model instanceof School && $user->hasRole('super_admin') && $model->is_featured) { return true; } return null; }
原理说明
当你通过$user->can('view', $school)这类方式调用权限时,Laravel会优先触发Policy的before方法,并将调用时传入的所有参数(除了权限名称)传递给它:
- 返回
true:直接允许该权限,跳过后续Policy方法的执行 - 返回
false:直接拒绝该权限 - 返回
null:继续执行对应权限的Policy方法(如view、update)
内容的提问来源于stack exchange,提问作者Dom
相关产品推荐
相关产品推荐

