如何在Seeder中通过Laratrust为填充生成的用户分配角色
实现方法
1. 先调整Seeder执行顺序
角色和权限数据必须比用户数据先生成,不然给用户绑角色的时候会查不到对应角色直接报错。修改DatabaseSeeder,先执行Laratrust自带的Seeder,再跑你自己的用户填充逻辑:
class DatabaseSeeder extends Seeder { /** * Seed the application's database. * * @return void */ public function run() { // 第一步:生成角色、权限基础数据 $this->call(LaratrustSeeder::class); // 第二步:创建用户并分配角色 $this->call(UsersTableSeeder::class); } }
2. 编写用户填充逻辑
先执行命令生成独立的用户Seeder文件,避免直接修改Laratrust自带的Seeder,后续升级扩展包不会覆盖你的自定义逻辑:
php artisan make:seeder UsersTableSeeder
打开生成的database/seeders/UsersTableSeeder.php,在run方法里写用户创建逻辑,用户创建完成后直接调用Laratrust提供的attachRole()方法绑定角色就行,注意传入的角色标识要和你Laratrust配置里定义的角色名完全一致:
<?php namespace Database\Seeders; use App\Models\User; use Illuminate\Database\Seeder; use Illuminate\Support\Facades\Hash; class UsersTableSeeder extends Seeder { public function run() { // 创建超级管理员账号 $admin = User::create([ 'name' => '系统管理员', 'email' => 'admin@example.com', 'password' => Hash::make('12345678'), ]); // 绑定超级管理员角色,角色名替换成你自己项目里实际配置的 $admin->attachRole('superadmin'); // 批量生成10个普通测试用户 User::factory()->count(10)->create()->each(function ($user) { // 给普通用户绑定普通用户角色 $user->attachRole('user'); }); } }
3. 避坑检查
- 确认
User模型已经引入了Laratrust要求的用户Trait,否则调用角色方法会报错,常规引入方式如下(如果你的Laratrust版本有差异,按照对应版本的安装要求引入即可):use Laratrust\Traits\LaratrustUserTrait; class User extends Authenticatable { use LaratrustUserTrait; // 其余模型代码 } - 如果你修改过
config/laratrust_seeder.php里的角色配置,要确认你代码里绑定的角色确实在配置里存在,否则会报角色不存在的错误。 - 要是你不想单独建UsersTableSeeder文件,也可以直接在
DatabaseSeeder里调用完LaratrustSeeder::class之后,直接写上面的用户创建、角色绑定代码,效果完全一样,单独拆分类只是为了后续维护更方便。
内容的提问来源于stack exchange,提问作者Mouise Bashir
相关产品推荐
相关产品推荐

