我知道,如何使用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}
中检索
答案 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
个实例。