带有额外参数的政策

时间:2018-05-08 14:57:22

标签: php laravel laravel-5.4 laravel-authorization

我知道,如何使用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()方法?

  

注意$diaryOwner从签名为user

的路线中的路线参数/diary/{user}中检索

1 个答案:

答案 0 :(得分:3)

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

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

可能存在问题,因为:

  

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

因此,不要使用request()->user使用request()->route()->parameter('user')

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