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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 03:23:13