Spatie laravel / permission-修改表和方法

时间:2018-08-06 23:47:24

标签: php laravel spatie

我正在使用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,而实际上我正在尝试分配一个具有额外参数的单个角色:$rolemodel_has_roles

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

1 个答案:

答案 0 :(得分: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 特征中的方法,这是一种更容易且更可取的方法。