Absolutely, Spatie Laravel Permission is designed to handle dynamic roles and permissions, including creating them at runtime via your application’s UI (like an admin panel). Here’s how you can achieve this:
1. Creating Roles and Permissions Dynamically
You can create new roles and permissions using the provided models:
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;
// Create a new permission
$createArticle = Permission::create(['name' => 'create article']);
$editArticle = Permission::create(['name' => 'edit article']);
$publishArticle = Permission::create(['name' => 'publish article']);
// Create a new role and assign permissions
$writerRole = Role::create(['name' => 'writer']);
$writerRole->givePermissionTo(['create article', 'edit article', 'publish article']);
You can wrap this logic in a controller or service and call it from your admin section.
2. Assigning Roles/Permissions to Users
$user = User::find($userId);
$user->assignRole('writer'); // or $user->syncRoles(['writer', ...]);
3. Checking Permissions in Your Application
In your controllers, policies, or Blade templates, you can check for permissions:
// In controller or policy
if ($user->can('publish article')) {
// Allow publishing
}
// In Blade
@can('publish article')
<button>Publish</button>
@endcan
4. Dynamic Management in Admin Section
- Create forms in your admin panel to add new roles and permissions.
- Assign permissions to roles and roles to users via the UI.
- Use the above code in your controllers/services to persist these changes.
5. Applying Permissions to Application Sections
For example, in your ArticleController:
public function publish(Article $article)
{
$this->authorize('publish article');
// publishing logic...
}
Or, using middleware:
Route::post('/articles/{article}/publish', 'ArticleController@publish')
->middleware('permission:publish article');
Summary
- Spatie Permission fully supports dynamic creation and assignment of roles/permissions.
- Build admin UI to manage roles/permissions.
- Use middleware, policies, or Blade directives to enforce permissions.
Official docs for reference:
https://spatie.be/docs/laravel-permission/v5/basic-usage/basic-usage
Let me know if you need a more detailed example for a specific part!