php - 带有额外参数的策略

标签 php laravel laravel-5.4 laravel-authorization

我知道,如何使用 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;
}

我在 Controller 中使用它,例如 $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}

最佳答案

您可以访问 $diaryOwner在政策中使用 request() helper 。

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实例。

关于php - 带有额外参数的策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50236617/

相关文章:

php $_POST 未发送完整值

php - 为什么 laravel 序列化 session 数据而不是 session 编码/解码

php - Laravel 5 使用原始查询将结果获取到数组

php - 查询在 Laravel 中未按预期工作

php - 每 X 小时 Laravel 任务调度

php - 如何在 XML 文件中连接相似的标签

php 静态函数 vs 实例函数,基础知识

php - Calcinai xero-php 通过一次配置

php - require_once(../../path/to/script.php) 无法打开流权限被拒绝

laravel - 将 Laravel 8 与 Sanctum hasapitokens 一起使用以使用记住我的选项登录