0

我正在使用 Laravel 5.6 和 Spatie laravel-permission,我想修改它,model_has_roles以便它可以有一个名为code.

现在,我通过修改库通过下一个命令提供的迁移来做到这一点:

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="migrations"

这个库提供了一个有用的命令:

$user->assignRole($role);

这让我可以在一行代码中为用户分配一个角色。我的问题是,使用此命令会引发错误,因为我不能将code字段留空。无论哪种方式,我都不能做这样的事情:

$user->assignRole($role, ['code' => '0001']);

因为它会这么说0001 is not a role。基本上,它假定我正在尝试为用户分配两个不同的角色:$role0001实际上我正在尝试分配一个角色:$role为 table 添加一个额外的参数model_has_roles

有没有办法归档这样的东西?我想也许我可以修改assignRole方法背后的逻辑,但我不知道如何扩展/编辑库方法。

4

1 回答 1

1

我看到您已经在迁移中添加了列,所以现在您需要在assignRole方法中进行更改。

Spatie 权限包通过在User模型类中添加HasRoles特征来工作。

这是特征的完整路径-

use Spatie\Permission\Traits\HasRoles;

要使用assignRole方法实现您想要的,您可以简单地从HasRoles特征复制内容,然后从该代码创建您自己的特征。您可以在此特征中看到方法-

    public function assignRole(...$roles)
    {
        $roles = collect($roles)
            ->flatten()
            ->map(function ($role) {
                if (empty($role)) {
                    return false;
                }

                return $this->getStoredRole($role);
            })
            ->filter(function ($role) {
                return $role instanceof Role;
            })
            ->each(function ($role) {
                $this->ensureModelSharesGuard($role);
            })
            ->map->id
            ->all();

        $model = $this->getModel();

        if ($model->exists) {
            $this->roles()->sync($roles, false);
            $model->load('roles');
        } else {
            $class = \get_class($model);

            $class::saved(
                function ($object) use ($roles, $model) {
                    static $modelLastFiredOn;
                    if ($modelLastFiredOn !== null && $modelLastFiredOn === $model) {
                        return;
                    }
                    $object->roles()->sync($roles, false);
                    $object->load('roles');
                    $modelLastFiredOn = $object;
                });
        }

        $this->forgetCachedPermissions();

        return $this;
    }

在此方法中进行所需的更改并使用您的自定义特征而不是使用 spatie 的HasRole特征。

或者,您也可以在您的类中覆盖HasRoles特征中的方法,这是一种更简单且首选的方法。

于 2019-02-28T16:31:22.473 回答