Php “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

我想问一下关于在Laravel背包许可管理器中播种的问题

我正在尝试默认的背包权限管理器配置,并尝试使用虚拟数据为其种子

以下是我的角色和权限播种器方法:

公共函数运行()
{
//重置缓存的角色和权限
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');
}