Roles is a table, you don't seed again.
Adding roles and permissions
- Most authorization packages store their roles and permissions in the database
- On day 1, I might have 2 roles, buyer and seller. I think most people will add this using a seeder
- On day 30, I need to add another 2 roles, admin and agent
If I modify the seeder on day 30, it will add buyer and seller roles again
How do you guys progressively populate these roles and permissions over time?
Here's an example of my roles and permission seeders using Spatie permissions package. I use firstOrCreate for not duplicating roles and permissions.
And I store added roles and permissions in arrays to delete them, that way the seeder will also delete unwanted roles and permission.
public function run()
{
// Reset cached roles and permissions
app()[PermissionRegistrar::class]->forgetCachedPermissions();
// Roles and permissions
$roles = [
[
'name' => 'Role Name',
'permissions' => [
'Permission Name',
],
],
[
'name' => 'Role without permission's,
'permissions' => [],
],
];
$addedRoles = [];
$addedPermissions = [];
foreach ($roles as $roleMap) {
$role = Role::firstOrCreate(['name' => $roleMap['name']]);
$addedRoles[] = $roleMap['name'];
foreach ($roleMap['permissions'] as $permissionName) {
$permission = Permission::firstOrCreate(['name' => $permissionName]);
$role->givePermissionTo($permission);
$addedPermissions[] = $permissionName;
}
}
Role::whereNotIn('name', $addedRoles)->delete();
Permission::whereNotIn('name', $addedPermissions)->delete();
}
I used seeder in that project because it was making since. However you can also create a command that will add necessary roles if seeders isn't a good for your case.
Please or to participate in this conversation.