代码之家  ›  专栏  ›  技术社区  ›  enbermudas

Spatial laravel/权限-修改表和方法

  •  0
  • enbermudas  · 技术社区  · 8 年前

    我正在与Laravel 5.6和Spatial合作 laravel-permission 我想修改 model_has_roles 所以它可以有一个名为 code .

    现在,我通过下一个命令修改了库提供的迁移:

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

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

    $user->assignRole($role);

    这样我就可以在一行代码中为用户分配一个角色。我的问题是,使用这个命令会抛出一个错误,因为我不能离开 密码 字段为空。不管怎样,我都不能这样做:

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

    因为它会这么说 0001 is not a role .基本上,我试图给用户分配两个不同的角色: $role 0001 实际上,我正在尝试分配一个角色: $role 为表格添加了一个额外的参数 模特有自己的角色 .

    有没有办法解决这样的问题?我想也许我可以修改这项计划背后的逻辑 assignRole 方法,但我不知道如何扩展/编辑库方法。

    1 回复  |  直到 4 年前
        1
  •  1
  •   Pankaj    7 年前

    我看到你已经在迁移中添加了这个列,所以现在你需要在 分配角色 方法

    空间许可 通过添加 有角色 性格特征 使用者 模范班。

    这就是这种特质的完整路径-

    use Spatie\Permission\Traits\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;
        }
    

    在该方法中进行所需的更改,并使用 风俗 而不是使用空间的 哈斯罗 特质

    或者,也可以从中重写该方法 有角色 在你的课堂上,哪种方式更容易,更受欢迎。

    推荐文章