带有额外参数的策略

Policies with extra parameters

我知道如何使用 Laravel 策略并且一切正常,但我仍然坚持使用 create(...) 方法。

我的应用程序是滑雪运动员的训练日记。每个 racer 都可以管理(查看、添加、编辑..)他自己的日记。每个教练可以管理自己的日记,所有赛车手的日记,但不能管理其他教练的日记。我使用本机 Laravel 策略,它在 *update(...)delete(...) 方法期间运行良好,但在 create(...).

期间运行良好

TrainingRecordPolicy.php:

public function update(User $user, TrainingRecord $record)
{
    if ($user->id == $record->user->id) {
        return true;
    }
    if ($user->isTrainer() && $record->user->isRacer()) {
        return true;
    }
    return false;
}

我在 $this->authorize('update', $record) 这样的控制器中使用它。但是如果我想检查,如果用户可以在其他用户日记中创建新记录,我不知道如何处理。

这不起作用 $this->authorize('create', TrainingRecord::class, $diaryOwner),如果我使用 $this->authorize('createDiaryRecord', $diaryOwner),它会调用 UserPolicy 中的方法。

如何将 $diaryOwner 作为额外参数发送到策略中的 create() 方法?

Note: $diaryOwner is retrieved from the route parameter user in route with signature /diary/{user}

您可以使用 request() 帮助程序访问策略中的 $diaryOwner

public function create(User $user) 
{
    $diaryOwner = request()->user; // because route is defined as /diary/{user}
}

可能有问题,因为:

When using dynamic properties, Laravel will first look for the parameter's value in the request payload. If it is not present, Laravel will search for the field in the route parameters.

所以不要使用 request()->user 使用 request()->route()->parameter('user').

此外,如果您使用 \Illuminate\Routing\Middleware\SubstituteBindings::class,您将获得 User 个实例。