Laravel - 使用Gate ::允许多个对象

时间:2018-04-10 19:01:32

标签: laravel laravel-5 laravel-5.5 laravel-5.6

有没有办法验证多个元素或ID的策略?

我们说我有$user个对象。

我能做到:\Gate::allows('delete', $user)

如果我有一组User个对象:$users,该怎么办?

有没有办法\Gate::allows('delete', $users)

编辑:

我有删除多个实体的路线。

Route::delete('/users', 'UsersController@deleteMultiple');

有效负载是ids的数组。

['ids' => [1, 2, 3]]

1 个答案:

答案 0 :(得分:2)

在Laravel中定义Gate时,可以将任意数量的参数传递给闭包。唯一的要求是第一个参数接受$user参数,该参数是当前经过身份验证的用户。您定义的任何其他参数完全取决于您。您可以轻松编写一个授权批量删除功能的Gate,如下所示:

Gate::define('bulk-delete', function ($user, Collection $users) {
    // Your logic may differ
    return $users->every(function ($subject) use ($user) {
        return $user->canDelete($subject);
    });
});

然后,在您的控制器或服务类中,您可以编写以下内容:

if (Gate::allows('bulk-delete', $users)) {
    // The current user can bulk delete the users...
}

当然,您可能希望将其重构为Policy类以获得更好的可维护性。