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()策略中的方法?
注意:
$diaryOwner从user带有签名的路由中的路由参数中检索/diary/{user}
您可以$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实例。