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

v1.0.0 2025-11-30 06:07 UTC

This package is auto-updated.

Last update: 2025-12-30 16:52:10 UTC


README

Latest Version on Packagist Total Downloads License

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