繁体   English   中英

Spatie laravel / permission-修改表和方法

[英]Spatie laravel/permission - Modifying table and methods

我正在使用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 ,该表model_has_roles用于表model_has_roles的额外参数。

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

我看到您已经在迁移中添加了该列,因此现在您需要在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特性中的方法,这是一种更容易且首选的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM