Certainly! Here’s a step-by-step solution for using the Spatie Roles & Permissions package with Filament in a modular (module) structure, such as one created with packages like nWidart/laravel-modules.
1. Install The Spatie and Filament Packages
If you haven't already:
composer require spatie/laravel-permission
composer require filament/filament
2. Publish and Configure Spatie
Run the following:
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
php artisan migrate
3. Load Config from Proper Module
If your roles/permissions configuration lives in a module (e.g. a module called Admin), ensure the published config (config/permission.php) matches the models in your module, e.g.:
'models' => [
'role' => Modules\Admin\Entities\Role::class,
'permission' => Modules\Admin\Entities\Permission::class,
],
And be sure your models in the module use the appropriate Spatie traits.
4. Register ServiceProvider (If Needed)
If you're overriding routes, models or configs in your module, you may need to use your module's ServiceProvider to:
- Publish/make your own migrations (and run them)
- Publish your own config and merge it
Example in your module's ModuleServiceProvider:
$this->mergeConfigFrom(__DIR__ . '/../Config/permission.php', 'permission');
5. Use Traits in Module's Models
Your module's User.php, Role.php, and Permission.php should use Spatie traits:
Example (Modules/Admin/Entities/User.php):
use Spatie\Permission\Traits\HasRoles;
class User extends Model
{
use HasRoles;
// ...
}
Example (Modules/Admin/Entities/Role.php):
use Spatie\Permission\Models\Role as SpatieRole;
class Role extends SpatieRole
{
// Optionally extend or override
}
6. Use with Filament
Create Filament Resources for users, roles, and permissions within the module structure, referencing your module models.
Example:
namespace Modules\Admin\Filament\Resources;
use Filament\Resources\Resource;
use Modules\Admin\Entities\Role;
class RoleResource extends Resource
{
protected static string $model = Role::class;
// define forms, tables, etc.
}
7. Middleware in Modules
Ensure your module's routes use the correct middleware. Example:
Route::middleware(['web', 'auth', 'role:admin'])
->prefix('admin')
->group(function () {
// Module routes here
});
8. Filament Auth / Policies
Filament respects Laravel's policies. You can use Spatie's permissions directly:
public function can(string $permission): bool
{
return auth()->user()?->can($permission);
}
Or, use Filament's built-in authorization features referencing your module's permissions.
Summary:
Yes, Spatie Laravel Permission supports module structures. Just ensure:
- Your module models use Spatie's traits
- The config references your module's Role/Permission models
- Your Filament resources use those models
- Service provider in your module merges/overrides the config if needed
Let me know if you need a working example repo or a more detailed code sample!