带有额外参数的策略

Arx*_*iss 2 php laravel laravel-authorization laravel-5.4

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

我的应用程序是滑雪运动员的训练日记。每个赛车手都可以管理(查看、添加、编辑...)自己的日记。每个教练都可以管理自己的日记,所有赛车手的日记,但不能管理其他教练的日记。我使用本地 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

注意$diaryOwneruser带有签名的路由中的路由参数中检索/diary/{user}

Kys*_*lik 5

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

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

可能有问题,因为:

使用动态属性时,Laravel 将首先在请求负载中查找参数的值。如果不存在,Laravel 将在路由参数中搜索该字段。

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

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