【问题标题】:Policies with extra parameters带有额外参数的策略
【发布时间】:2018-10-18 13:59:15
【问题描述】:

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

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

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

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

注意$diaryOwner是从带有签名/diary/{user}的路由中的路由参数user获取的

【问题讨论】:

  • 你是怎么得到$diaryOwner的?
  • 来自路由参数:/diary/{user}/new-record。 TrainingRecord 没有详细信息(视图)。整个赛季只有一张表格,所有记录都列在日历议程之类的东西中。
  • 所以在示例中$this->authorize('create', ..., $diaryOwner) $diaryOwner 是User 的实例还是只是id? User模型和Diary模型有什么关系?将其添加到 OP。
  • 没有型号Diary。有TrainingRecordUser两种型号。用户可以有更多的记录。在路线/diary/{user} 中,您可以在日历议程之类的内容中查看用户的所有TrainingRecords。您可以将其视为日历。你有日历,你的教练有日历。他可以写进你自己的。但你不能写到他的

标签: php laravel laravel-5.4 laravel-authorization


【解决方案1】:

您可以使用request() 助手访问策略中的$diaryOwner

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多