【问题标题】:Spatie laravel/permission - Modifying table and methodsSpatie laravel/permission - 修改表和方法
【发布时间】:2018-08-06 23:47:23
【问题描述】:

我正在使用 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 .

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

【问题讨论】:

  • 您没有向我们提供有关如何处理名为code 的新列的足够信息,但您可以将其设置为可为空,并将其默认值设置为null。如果这是您要问的问题,我会将其写为答案
  • 我说我不能在使用assignRole 方法时为我的用户/角色关系设置code 值。我不希望code 默认为null:我想分配一个角色并在执行此操作时为model_has_roles 表设置一个额外的字段。
  • 我认为这是分两步完成的,除非您更改 assignRole 方法
  • 但是,我该如何更改assignRole 方法或者这两个步骤是什么样的?

标签: php laravel laravel-permission


【解决方案1】:

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

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

这是特征的完整路径-

use Spatie\Permission\Traits\HasRoles;

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-16
    • 2016-12-04
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    • 1970-01-01
    相关资源
    最近更新 更多