A Laravel package that provides multi-tenant module management capabilities, allowing you to create, enable, disable, and manage modules per tenant in your Laravel application.
- Install the package via Composer:
composer require egerstudios/tenant-modules- Publish the configuration and migrations:
php artisan vendor:publish --provider="Egerstudios\TenantModules\TenantModulesServiceProvider"- Run the migrations:
php artisan migrateThe package configuration is published to config/tenant-modules.php. Here are the main configuration options:
return [
'path' => 'modules', // Base path for modules
'namespace' => 'Modules', // Base namespace for modules
'provider' => 'Providers\\ModuleServiceProvider', // Default service provider name
'middleware' => [
'enabled' => true, // Enable/disable middleware
'prefix' => 'module', // URL prefix for module routes
],
];Each module follows this structure:
modules/
└── ModuleName/
├── config/
│ ├── module.php
│ └── navigation.yaml
├── database/
│ └── migrations/
├── resources/
│ ├── views/
│ └── lang/
├── routes/
│ └── web.php
├── src/
│ ├── Controllers/
│ ├── Models/
│ └── Services/
└── composer.json
Each module requires a config/module.php file:
return [
'name' => 'ModuleName',
'enabled' => true,
'description' => 'Module description',
'version' => '1.0.0',
];Modules can define their navigation in config/navigation.yaml:
items:
- label: Module Name
icon: module
route: module.index
permission: module.view
children:
- label: Sub Item
route: module.sub
permission: module.viewphp artisan module:make ModuleNameOptions:
--description: Module description--version: Module version--force: Overwrite existing module
php artisan module:listphp artisan module:enable ModuleNameOptions:
--tenant: Specific tenant ID--all-tenants: Enable for all tenants
php artisan module:disable ModuleNameOptions:
--tenant: Specific tenant ID--all-tenants: Disable for all tenants
php artisan module:delete ModuleNameOptions:
--force: Force deletion without confirmation
php artisan module:build ModuleNameThe package provides several helper functions:
module_path('ModuleName', 'path/to/file');module_namespace('ModuleName', 'Path\\To\\Class');module_provider('ModuleName');module_enabled('ModuleName');
module_disabled('ModuleName');modules(); // Get all modules
modules('ModuleName'); // Get specific module infoThe package includes a middleware to protect module routes:
Route::middleware(['web', 'auth', 'module:ModuleName'])->group(function () {
// Module routes
});The package fires several events:
ModuleEnabled: When a module is enabledModuleDisabled: When a module is disabledModuleDeleted: When a module is deleted
- Always use the helper functions to reference module paths and namespaces
- Keep module-specific code within the module directory
- Use the navigation configuration for consistent UI
- Implement proper permissions for module access
- Use the middleware to protect module routes
Please see CONTRIBUTING.md for details.
The MIT License (MIT). Please see License File for more information.