![](/img/trans.png)
[英]Spatie/Laravel-Permission mapping permissions with controller methods
[英]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
。 基本上,它假定我正在尝试为用户分配两个不同的角色: $role
和0001
而实际上我正在尝试分配一个角色: $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.