typetomamun / laravel-event-guard
Multi-tenant permission and role management for Laravel applications. Manage permissions for multiple shops, forums, groups, and more.
Installs: 1
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 0
Forks: 0
Open Issues: 0
pkg:composer/typetomamun/laravel-event-guard
Requires
- php: >=8.2
- illuminate/support: ^12.0
README
Multi-tenant permission and role management for Laravel 11 & 12. Perfect for applications where users can create multiple shops, forums, groups, announcements, and more - each with their own isolated roles and permissions.
Features
- 🏢 Multi-Tenant Architecture: Users can own multiple events (shops, forums, groups, etc.)
- 🔐 Event-Scoped Permissions: Roles and permissions isolated per event instance
- 👤 Automatic Owner Detection: Event owners automatically have all permissions
- 🎯 Flexible Role System: Assign roles globally or per event
- 🛡️ Middleware Support: Easy route protection with intuitive syntax
- 🎨 Blade Directives: Clean permission checks in views
- 🚀 Zero Conflicts: All tables and methods prefixed with
egd_ - ⚡ Laravel 11 & 12 Compatible: Built for modern Laravel
Installation
composer require typetomamun/laravel-event-guard
Publish the config and migrations:
php artisan vendor:publish --tag=eventguard-config php artisan vendor:publish --tag=eventguard-migrations
Run migrations:
php artisan migrate
Quick Start
1. Add Trait to User Model
use TypeToMamun\LaravelEventGuard\Traits\EGDHasRoles; class User extends Authenticatable { use EGDHasRoles; }
2. Create Event Types
use TypeToMamun\LaravelEventGuard\Models\EGDEventType; EGDEventType::create([ 'name' => 'Shop', 'slug' => 'shop', ]);
3. Create Events
use TypeToMamun\LaravelEventGuard\Models\EGDEvent; $shop = EGDEvent::create([ 'event_type_id' => $shopType->id, 'name' => 'My Awesome Shop', 'slug' => 'my-awesome-shop', 'owner_id' => auth()->id(), ]);
4. Assign Roles
// Assign user as manager of a specific shop $user->egdAssignEventRole($shop, 'manager'); // Give direct permission $user->egdGiveEventPermission($shop, 'manage products');
5. Protect Routes
// Only shop managers can access Route::middleware(['egd.event.role:{shop},manager'])->group(function () { Route::get('/shops/{shop}/dashboard', [ShopController::class, 'dashboard']); }); // Only users with specific permission Route::middleware(['egd.event.permission:{shop},manage products'])->group(function () { Route::post('/shops/{shop}/products', [ProductController::class, 'store']); });
6. Use in Blade
@egdeventowner($shop) <a href="/shops/{{ $shop->slug }}/settings">Settings</a> @endegdeventowner @egdeventrole($shop, 'manager') <button>Manage Staff</button> @endegdeventrole @egdeventpermission($shop, 'manage products') <button>Add Product</button> @endegdeventpermission
Documentation
Available Methods
Event-Scoped Methods
// Check if user has role for specific event $user->egdHasEventRole($shop, 'manager'); // Check if user has permission for specific event $user->egdHasEventPermission($shop, 'manage products'); // Assign role to user for specific event $user->egdAssignEventRole($shop, 'manager'); // Give permission to user for specific event $user->egdGiveEventPermission($shop, 'edit products'); // Remove role from user for specific event $user->egdRemoveEventRole($shop, 'staff'); // Check if user is event owner $user->egdIsEventOwner($shop); // Get all events of a type owned by user $myShops = $user->egdGetEventsForType('shop');
Global Methods
// Check global role $user->egdHasRole('admin'); // Assign global role $user->egdAssignRole('admin'); // Check global permission $user->egdHasPermissionTo('manage system');
Middleware
// Event-scoped role middleware Route::middleware(['egd.event.role:{event},manager'])->group(function () { // Routes here }); // Event-scoped permission middleware Route::middleware(['egd.event.permission:{event},edit articles'])->group(function () { // Routes here }); // Global role middleware Route::middleware(['egd.role:admin'])->group(function () { // Routes here }); // Global permission middleware Route::middleware(['egd.permission:manage system'])->group(function () { // Routes here });
Blade Directives
{{-- Event-scoped directives --}} @egdeventowner($event) {{-- Content for event owner --}} @endegdeventowner @egdeventrole($event, 'manager') {{-- Content for managers --}} @endegdeventrole @egdeventpermission($event, 'edit products') {{-- Content for users with permission --}} @endegdeventpermission {{-- Global directives --}} @egdrole('admin') {{-- Content for admins --}} @endegdrole @egdpermission('manage system') {{-- Content for users with permission --}} @endegdpermission
Use Cases
Multi-Shop Platform
// User creates multiple shops $shop1 = EGDEvent::create([...], 'electronics-store', owner: $user); $shop2 = EGDEvent::create([...], 'fashion-boutique', owner: $user); // Assign staff to specific shops $manager->egdAssignEventRole($shop1, 'manager'); $staff->egdAssignEventRole($shop1, 'staff'); // Permissions are isolated per shop $manager->egdHasEventPermission($shop1, 'manage products'); // ✅ true $manager->egdHasEventPermission($shop2, 'manage products'); // ❌ false
Forum Platform
// User creates forum $forum = EGDEvent::create([...], 'tech-forum', owner: $user); // Assign moderators $moderator->egdAssignEventRole($forum, 'moderator'); // Check permissions if ($moderator->egdHasEventPermission($forum, 'delete posts')) { // Can delete posts in this forum }
Configuration
Publish and customize the config file:
// config/egd_permission.php return [ 'models' => [ 'event' => \TypeToMamun\LaravelEventGuard\Models\EGDEvent::class, 'role' => \TypeToMamun\LaravelEventGuard\Models\EGDRole::class, // ... ], 'event_types' => [ 'shop' => [ 'name' => 'Shop', 'roles' => ['owner', 'manager', 'staff'], 'permissions' => ['view', 'edit', 'delete', 'manage products'], ], // Add your custom event types ], ];
Testing
composer test
Changelog
Please see CHANGELOG for more information on recent changes.
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
Security
If you discover any security-related issues, please email your-email@example.com instead of using the issue tracker.
Credits
License
The MIT License (MIT). Please see License File for more information.
Support
- 📧 Email: your-email@example.com
- 🐛 Issues: GitHub Issues
- 📖 Documentation: Full Documentation