Laravel 策略 - 如何将多个参数传递给函数

2022-08-30 17:43:03

我正在尝试授权用户角色删除/更新帖子。我正在使用策略来执行此操作,但我只能将一个参数传递给策略函数。如果我传递的次数多于用户和另一个变量,则该变量不会传递到函数中。

模型:用户有很多字符,一个字符可以发布多个帖子。因此,出于授权目的,我必须将帖子的character_id与当前角色的id进行比较......-

根据文档,您可以将更多倍数传递到门立面:

Gate::define('delete-comment', function ($user, $post, $comment) {
    //
});

但我无论如何都找不到这样做的政策。我所要做的是注入 Request 对象以获取授权所需的对象。基本上,我甚至不需要用户对象。

public function update(User $user, Post $post)
{
    return $user->id === $post->user_id;
}

使用 Request 对象可以工作,但感觉非常笨拙。有没有更好的方法来实现这一目标?

编辑:

在“我有一个方法,我想在显示资源之前授权该操作”。CharacterLocationControllershow

public function show(Request $request, Character $character, Location $location)
{
    $this->authorize([$location, $character]);
    ...
}

该策略按如下方式注册:在'App\Location' => 'App\Policies\LocationPolicy'AuthServiceProvider

我转储了传递给策略函数的数组,它只输出 .$location

public function show(User $user, $data) {
    dd($data); // expecting location and character
    return !$location->private || $location->authorized->contains($this->character);
}

答案 1

我认为这里可能存在一些关于哪些功能在做什么的混淆。

当您使用时

Gate::define('delete-comment', function ($user, $post, $comment) {
    //
});

或在CommentPolicy

public function delete(User $user, Post $post, Comment $comment)
{
    return $user->id === $post->user_id;
}

你所做的就是定义规则。在这一点上,我们不担心传递任何东西,只是我们收到的对象可以或应该能够相互交互。这两者之间的唯一区别是在使用策略时,它只是将所有规则抽象为一个简单易读的类的简单方法。如果你有一个可能包含数百个表和模型的应用,如果你的应用中到处都是这些规则,那么它很快就会令人困惑,因此策略将有助于保持它们井井有条。

当你真正检查某人是否有权做某事时,你应该传递这些项目。例如,当您执行以下操作时,

if (Gate::allows('delete-comment', [$post, $comment])) {
    // 
}

或者,如果在CommentController

$this->authorize('delete', [$post, $comment]);

这就是控制哪些参数将传递给策略或方法的内容。根据文档,该参数已经为您添加,因此在这种情况下,您只需要担心传递正确的参数并被修改。Gate::define$user$post$comment


答案 2

推荐