Laravel - 对多个对象使用 Gate::allows

Laravel - Using Gate::allows for multiple objects

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

假设我有一个 $user 对象。

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

如果我有 User 个对象的集合怎么办:$users

有办法做到吗\Gate::allows('delete', $users)?

编辑:

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

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

有效负载是 ids.

的数组

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

在 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);
    });
});

然后,在你的控制器或服务中class,你可以这样写:

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

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