Add auto-loading of module permissions in RolePermissionSeeder
RolePermissionSeeder now automatically scans app/Modules/*/Permissions.php files and registers all permissions found. No manual registration required. - Added loadModulePermissions() method to scan module directories - Changed givePermissionTo() to syncPermissions() for idempotency - Updated Modules README to document auto-loading - Updated CLAUDE.md to reflect auto-loading behavior
This commit is contained in:
@@ -260,7 +260,7 @@ return new class extends Migration
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
### 5. Permissions (REQUIRED)
|
### 5. Permissions (REQUIRED) - AUTO-LOADED
|
||||||
|
|
||||||
**File**: `src/app/Modules/[ModuleName]/Permissions.php`
|
**File**: `src/app/Modules/[ModuleName]/Permissions.php`
|
||||||
|
|
||||||
@@ -275,6 +275,9 @@ return [
|
|||||||
];
|
];
|
||||||
```
|
```
|
||||||
|
|
||||||
|
> **✅ AUTO-LOADED**: `RolePermissionSeeder` automatically scans all `app/Modules/*/Permissions.php`
|
||||||
|
> files and registers them. Just run `php artisan db:seed --class=RolePermissionSeeder`.
|
||||||
|
|
||||||
### 6. Filament Resource (REQUIRED for admin)
|
### 6. Filament Resource (REQUIRED for admin)
|
||||||
|
|
||||||
**File**: `src/app/Modules/[ModuleName]/Filament/Resources/[ModelName]Resource.php`
|
**File**: `src/app/Modules/[ModuleName]/Filament/Resources/[ModelName]Resource.php`
|
||||||
|
|||||||
@@ -94,6 +94,9 @@ ## Permissions
|
|||||||
];
|
];
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**Permissions are auto-loaded!** When you run `php artisan db:seed --class=RolePermissionSeeder`,
|
||||||
|
it scans all `app/Modules/*/Permissions.php` files and registers them automatically.
|
||||||
|
|
||||||
Use in Blade:
|
Use in Blade:
|
||||||
```blade
|
```blade
|
||||||
@can('stock_management.view')
|
@can('stock_management.view')
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
namespace Database\Seeders;
|
namespace Database\Seeders;
|
||||||
|
|
||||||
use Illuminate\Database\Seeder;
|
use Illuminate\Database\Seeder;
|
||||||
|
use Illuminate\Support\Facades\File;
|
||||||
use Spatie\Permission\Models\Role;
|
use Spatie\Permission\Models\Role;
|
||||||
use Spatie\Permission\Models\Permission;
|
use Spatie\Permission\Models\Permission;
|
||||||
use App\Models\User;
|
use App\Models\User;
|
||||||
@@ -13,7 +14,8 @@ public function run(): void
|
|||||||
{
|
{
|
||||||
app()[\Spatie\Permission\PermissionRegistrar::class]->forgetCachedPermissions();
|
app()[\Spatie\Permission\PermissionRegistrar::class]->forgetCachedPermissions();
|
||||||
|
|
||||||
$permissions = [
|
// Core permissions
|
||||||
|
$corePermissions = [
|
||||||
'users.view',
|
'users.view',
|
||||||
'users.create',
|
'users.create',
|
||||||
'users.edit',
|
'users.edit',
|
||||||
@@ -21,18 +23,22 @@ public function run(): void
|
|||||||
'settings.manage',
|
'settings.manage',
|
||||||
];
|
];
|
||||||
|
|
||||||
foreach ($permissions as $permission) {
|
foreach ($corePermissions as $permission) {
|
||||||
Permission::firstOrCreate(['name' => $permission]);
|
Permission::firstOrCreate(['name' => $permission]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Auto-load module permissions from app/Modules/*/Permissions.php
|
||||||
|
$this->loadModulePermissions();
|
||||||
|
|
||||||
|
// Create roles
|
||||||
$adminRole = Role::firstOrCreate(['name' => 'admin']);
|
$adminRole = Role::firstOrCreate(['name' => 'admin']);
|
||||||
$adminRole->givePermissionTo(Permission::all());
|
$adminRole->syncPermissions(Permission::all());
|
||||||
|
|
||||||
$editorRole = Role::firstOrCreate(['name' => 'editor']);
|
$editorRole = Role::firstOrCreate(['name' => 'editor']);
|
||||||
$editorRole->givePermissionTo(['users.view', 'users.edit']);
|
$editorRole->syncPermissions(['users.view', 'users.edit']);
|
||||||
|
|
||||||
$viewerRole = Role::firstOrCreate(['name' => 'viewer']);
|
$viewerRole = Role::firstOrCreate(['name' => 'viewer']);
|
||||||
$viewerRole->givePermissionTo(['users.view']);
|
$viewerRole->syncPermissions(['users.view']);
|
||||||
|
|
||||||
// Create admin user if not exists
|
// Create admin user if not exists
|
||||||
$admin = User::firstOrCreate(
|
$admin = User::firstOrCreate(
|
||||||
@@ -45,4 +51,35 @@ public function run(): void
|
|||||||
);
|
);
|
||||||
$admin->assignRole('admin');
|
$admin->assignRole('admin');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scan app/Modules/*/Permissions.php and register all module permissions.
|
||||||
|
*/
|
||||||
|
protected function loadModulePermissions(): void
|
||||||
|
{
|
||||||
|
$modulesPath = app_path('Modules');
|
||||||
|
|
||||||
|
if (!File::isDirectory($modulesPath)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$modules = File::directories($modulesPath);
|
||||||
|
|
||||||
|
foreach ($modules as $modulePath) {
|
||||||
|
$permissionsFile = $modulePath . '/Permissions.php';
|
||||||
|
|
||||||
|
if (File::exists($permissionsFile)) {
|
||||||
|
$permissions = require $permissionsFile;
|
||||||
|
|
||||||
|
if (is_array($permissions)) {
|
||||||
|
foreach ($permissions as $permissionName => $description) {
|
||||||
|
// Handle both formats:
|
||||||
|
// ['permission.name' => 'Description'] or ['permission.name']
|
||||||
|
$name = is_string($permissionName) ? $permissionName : $description;
|
||||||
|
Permission::firstOrCreate(['name' => $name]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user