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

Php Laravel策略-如何将多个参数传递给函数,php,laravel,authorization,laravel-5.2,Php,Laravel,Authorization,Laravel 5.2,我正在尝试授权用户角色删除/更新帖子。我使用的是策略,但我只能向策略函数传递一个参数。如果传递的变量多于用户和另一个变量,则该变量不会传递到函数中 模型:用户有许多字符,一个字符可以发布多个帖子。所以出于授权目的,我必须将帖子的角色id与当前角色的id进行比较- 根据,您可以将更多倍数传递到大门立面: Gate::define('delete-comment', function ($user, $post, $comment) { // }); 但我找不到任何方法来处理政策。我必须做

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

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

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

Gate::define('delete-comment', function ($user, $post, $comment) {
    //
});
但我找不到任何方法来处理政策。我必须做的是注入请求对象,以获得授权所需的对象。基本上我甚至不需要用户对象

public function update(User $user, Post $post)
{
    return $user->id === $post->user_id;
}
使用Request对象是可行的,但感觉非常粗糙。有没有更好的方法来实现这一点

编辑:

CharacterLocationController
中,我有一个方法
show
,我想在显示资源之前授权操作

public function show(Request $request, Character $character, Location $location)
{
    $this->authorize([$location, $character]);
    ...
}
策略的注册方式如下:
AuthServiceProvider中的
'App\Location'=>'App\Policies\LocationPolicy'

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

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

我认为这里可能有一些关于函数在做什么的混淆

当你使用

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

感谢您的澄清,尽管我还有一个问题。策略本身被附加到一个类(像一个雄辩的模型),因此当传递一个适当类型的对象作为第二个参数时,规则被自动调用。如果您传递一个数组,就像您在
CommentController
示例中所做的那样,那么将使用什么策略?它是在试图解析传递的数组中的第一个对象吗?让我吃力的是没有在一个数组中传递多个额外的参数。Laravel文档在这方面可能会更详细一些。但是v很乐意发现问题。当方法不需要模型实例(如create)时,请注意将类名添加到数组中,例如
$this->authorize('create',[Comment::class,$post])
@piscator我可以对
authorizeResource()
做同样的操作吗?@piscator的注释在许多情况下在处理策略(以及存储相应的模型)时非常有用和必要。也许你可以把这个加到你的答案里?无论如何,谢谢你们两位