Laravel 10使用spatie/laravel-permission填充数据时遇角色不存在错误
问题:Laravel 10使用spatie/laravel-permission填充数据时提示RoleDoesNotExist
我是Laravel新手,正在学习spatie/laravel-permission,当前使用Laravel 10版本。尝试通过数据填充为数据库添加角色和用户时,遇到错误Spatie\Permission\Exceptions\RoleDoesNotExist,提示"There is no role named admin"。我已在RoleSeeder中创建admin角色,且User模型引入了HasRoles trait,不清楚问题所在,恳请帮助。
相关代码文件
RoleSeeder.php
<?php namespace Database\Seeders; use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; use Spatie\Permission\Models\Role; class RoleSeeder extends Seeder { /** * Run the database seeds. */ public function run(): void { Role::create(['name' => 'super admin', 'team_id' => 1, 'guard_name' => 'web']); Role::create(['name' => 'admin', 'team_id' => 1, 'guard_name' => 'web']); Role::create(['name' => 'user', 'team_id' => 1, 'guard_name' => 'web']); } }
AdminSeeder.php
<?php namespace Database\Seeders; use App\Models\User; use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; class AdminSeeder extends Seeder { /** * Run the database seeds. */ public function run(): void { $user = User::create( [ 'name' => 'admin', 'email' => 'admin@gmail.com', 'email_verified_at' => now(), 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password ]); $user->assignRole('admin'); } }
DatabaseSeeder.php
<?php namespace Database\Seeders; // use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; class DatabaseSeeder extends Seeder { /** * Seed the application's database. */ public function run(): void { $this->call([RoleSeeder::class, AdminSeeder::class]); } }
User.php
<?php namespace App\Models; // use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Laravel\Sanctum\HasApiTokens; use Spatie\Permission\Traits\HasRoles; class User extends Authenticatable { use HasApiTokens, HasFactory, Notifiable, HasRoles; protected $guard_name = 'web'; /** * The attributes that are mass assignable. * * @var array<int, string> */ protected $fillable = [ 'name', 'email', 'password', ]; /** * The attributes that should be hidden for serialization. * * @var array<int, string> */ protected $hidden = [ 'password', 'remember_token', ]; /** * The attributes that should be cast. * * @var array<string, string> */ protected $casts = [ 'email_verified_at' => 'datetime', 'password' => 'hashed', ]; }
可能的原因及解决办法
1. 多租户/团队字段不匹配
你创建角色时指定了team_id,说明启用了spatie的多租户模式,但创建用户时没有关联对应team_id,导致权限系统找不到对应团队下的角色。
解决:
给用户添加team_id字段,和角色的team_id保持一致:
$user = User::create( [ 'name' => 'admin', 'email' => 'admin@gmail.com', 'email_verified_at' => now(), 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password 'team_id' => 1, // 新增该行 ]); $user->assignRole('admin');
如果不需要多租户功能,直接移除RoleSeeder里的team_id参数:
Role::create(['name' => 'super admin', 'guard_name' => 'web']); Role::create(['name' => 'admin', 'guard_name' => 'web']); Role::create(['name' => 'user', 'guard_name' => 'web']);
2. 重新执行迁移和填充
可能之前的迁移或填充未正确执行,导致角色数据未写入数据库。执行以下命令重置并重新填充:
php artisan migrate:fresh --seed
3. 清除权限缓存
权限系统的缓存可能导致角色无法被识别,执行命令清除缓存:
php artisan cache:clear php artisan permission:cache-reset
4. 确认guard_name一致性
你的User模型和Role中的guard_name都是web,这部分没问题,但如果后续新增其他guard,需确保角色和用户的guard_name完全匹配。
内容的提问来源于stack exchange,提问作者Fly_Moe
相关产品推荐
相关产品推荐

