我正在使用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
。基本上,它假设我正在尝试为用户分配两个不同的角色:$role
和0001
,而实际上我正在尝试分配一个具有额外参数的单个角色:$role
表model_has_roles
。
有没有办法存档这样的东西?我以为也许我可以修改assignRole
方法背后的逻辑,但是我不知道如何扩展/编辑库方法。
答案 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 特征中的方法,这是一种更容易且更可取的方法。