Php “Laravel双肩包许可播种”;“角色不存在”;
我想问一下关于在Laravel背包许可管理器中播种的问题 我正在尝试默认的背包权限管理器配置,并尝试使用虚拟数据为其种子 以下是我的角色和权限播种器方法:Php “Laravel双肩包许可播种”;“角色不存在”;,php,laravel-5,backpack-for-laravel,spatie,Php,Laravel 5,Backpack For Laravel,Spatie,我想问一下关于在Laravel背包许可管理器中播种的问题 我正在尝试默认的背包权限管理器配置,并尝试使用虚拟数据为其种子 以下是我的角色和权限播种器方法: 公共函数运行() { //重置缓存的角色和权限 app()[\Spatie\Permission\permissionregister::class]->forgetCachedPermissions(); //创建权限 权限::创建(['name'=>'view members']); 权限::创建(['name'=>'addmembers
公共函数运行()
{
//重置缓存的角色和权限
app()[\Spatie\Permission\permissionregister::class]->forgetCachedPermissions();
//创建权限
权限::创建(['name'=>'view members']);
权限::创建(['name'=>'addmembers']);
权限::创建(['name'=>'edit members']);
权限::创建(['name'=>'delete members']);
角色::创建(['name'=>'super admin']))
->givePermissionTo(Permission::all());
角色::创建(['name'=>'admin']))
->给予许可(“添加成员”);
}
下面是我的用户播种器方法:
公共函数运行()
{
工厂(用户::类)->创建([
'name'=>'Arianna',
'电子邮件'=>'arianna@example.com'
])->分配角色(“超级管理员”);
}
这些种子机很好,但我意识到用户CRUD界面不能正确显示角色
用户角色显示为“-”
角色显示为-
当我检查数据库时,model_的角色显示为App\User作为model类型
应用程序\用户模型\类型:
我确信模型类型应该是App\Models\BackpackUser,所以我现在再次尝试使用BackpackUser类进行种子设定
现在我遇到了不同的问题,BackbackUser并没有任何角色,因为角色需要在“Backback”guard中分配给BackbackUser
Spatie\Permission\Exceptions\RoleDoesNotExist : There is no role named `super-admin`.
at .\vendor\spatie\laravel-permission\src\Exceptions\RoleDoesNotExist.php:11
7| class RoleDoesNotExist extends InvalidArgumentException
8| {
9| public static function named(string $roleName)
10| {
> 11| return new static("There is no role named `{$roleName}`.");
12| }
13|
14| public static function withId(int $roleId)
15| {
Exception trace:
1 Spatie\Permission\Exceptions\RoleDoesNotExist::named("super-admin")
.\vendor\spatie\laravel-permission\src\Models\Role.php:91
2 Spatie\Permission\Models\Role::findByName("super-admin", "backpack")
.\vendor\spatie\laravel-permission\src\Traits\HasRoles.php:270
我的选择是什么?为什么我不能用默认配置正常播种
请不要说我需要使用用户界面手动“播种”虚拟数据。当您创建角色和权限时,您应该使用
backpack\u guard\u name()定义backpack guard:
对角色执行相同的操作:
Role::create([
'name' => 'super-admin',
'guard_name' => backpack_guard_name()
]);
在您的表中,model\u具有\u角色
您的模型类型不能是App\User
,它应该是Backpack\Base\App\Models\backpackauser
:
use \Backpack\Base\app\Models\BackpackUser;
...
public function run()
{
factory(BackpackUser::class)->create([
'name' => 'Arianna',
'email' => 'arianna@example.com'
])->assignRole('super-admin');
}
注:
BackpackUser
扩展了App\User
,这可能会给您带来问题,因为您的User
可能有自定义字段,而使用BackpackUser
在工厂中创建时没有这些字段
要解决这个问题,您需要分两步进行。首先,创建包含所有必需字段的App\User
,然后,将用户作为BackpackUser
对象来分配角色或权限。由Spatie/Laravel权限引起的此问题还将模型类型存储在数据库中,并将权限放在BackpackUser或用户模型上
嗯。。刚刚从这里得到了答案:
2019年底,tabacitu刚刚添加了该解决方案:
基本上,您需要添加中间件,或者在用户上添加is_admin列,或者使用tabacitu提供的中间件,包缓存角色和权限。尝试刷新缓存,然后再次种子。您好Antonio,感谢您的回答,如果我使用附带的Laravel背包权限界面侧栏,创建的角色将以“web”作为默认的守卫名称。因此,如果我使用'guard_name'=>backpack_guard_name(),则种子角色和权限将不同于从接口插入的角色和权限
use \Backpack\Base\app\Models\BackpackUser;
...
public function run()
{
factory(BackpackUser::class)->create([
'name' => 'Arianna',
'email' => 'arianna@example.com'
])->assignRole('super-admin');
}