Installation:
composer require panicdevs/modulite
php artisan vendor:publish --tag=modulite-config
Configure config/modulite.php:
enabled to true.module_paths (e.g., ['Modules', 'App/Modules']).cache_path if needed (defaults to bootstrap/cache/modulite.php).Register the Plugin:
Add ModulitePlugin to your Filament panel provider(s):
use PanicDevs\Modulite\Filament\ModulitePlugin;
public function panel(Panel $panel): Panel
{
return $panel
->plugin(ModulitePlugin::make());
}
First Use Case:
Place a Filament panel, resource, or widget in a module (e.g., Modules/Users/Resources/UserResource). Run:
php artisan modulite:cache
Verify discovery by accessing your Filament panel—the module’s components should appear automatically.
Modular Development:
Modules/Admin/Panels/AdminPanel.php).modulite:discover to scan for reusable widgets/pages across modules.
php artisan modulite:discover --modules="Auth,Admin"
Performance Optimization:
modulite:cache after changes to reflect updates instantly.modulite:optimize to generate a static cache file (reduces discovery overhead).
php artisan modulite:optimize
modulite:cache:clear to invalidate specific module caches without full rebuilds.Integration with Filament:
ModulitePlugin::make()->withPanels() to conditionally register panels based on module availability.
$panel->plugin(ModulitePlugin::make()->withPanels(fn () => [
'admin' => config('modulite.panels.admin'),
]));
Modules/{Module}/Resources or Modules/{Module}/Widgets. Modulite auto-detects them.Multi-Environment Setups:
module_paths in .env or config/modulite.php per environment (e.g., disable discovery in staging).
'module_paths' => env('MODULE_PATHS', ['Modules']),
--modules flag to limit discovery to specific modules during development:
php artisan modulite:discover --modules="Auth"
Custom Discovery Patterns:
Extend discovery logic by publishing and modifying the discovery.php config:
'patterns' => [
'panels' => 'Modules/*/Panels/*Panel.php',
'resources' => 'Modules/*/Resources/*Resource.php',
// Add custom patterns (e.g., for Spatie Media Library handlers)
'media_handlers' => 'Modules/*/Handlers/*Handler.php',
],
Then register a custom discovery service:
Modulite::extend(function (Discovery $discovery) {
$discovery->registerMediaHandlers();
});
Event-Driven Workflows:
Listen to ModuliteDiscovered and ModuliteCached events to trigger post-discovery tasks (e.g., logging, notifications):
use PanicDevs\Modulite\Events\ModuliteDiscovered;
ModuliteDiscovered::listen(function (array $discovered) {
Log::info('Discovered modules:', $discovered);
});
Testing:
Modulite::shouldDiscover(false):
public function test_panel_without_discovery()
{
Modulite::shouldDiscover(false);
$panel = $this->getPanel();
// Assert no module components are registered
}
Modulite::fake() to simulate cached results:
Modulite::fake([
'panels' => ['admin' => AdminPanel::class],
]);
Cache Staleness:
modulite:cache is run.modulite:cache --watch in development to auto-rebuild on file changes.modulite:optimize is part of your deployment script (e.g., deploy.php).Circular Dependencies:
config/modulite.php:
'excluded_modules' => ['Core', 'Auth'],
Filament Version Conflicts:
composer require panicdevs/modulite:dev-main for bleeding-edge support.Overzealous Discovery:
module_paths, slowing down boot time.modulite:discover --modules to target specific modules.Plugin Registration Order:
ModulitePlugin must be registered after Filament’s core plugins but before custom plugins.panel() method:
$panel->plugin(
FilamentCorePlugin::make(),
ModulitePlugin::make(), // <-- Critical position
CustomPlugin::make(),
);
Discovery Logs:
Enable verbose logging in config/modulite.php:
'debug' => true,
Check storage/logs/laravel.log for discovery paths and errors.
Cache Inspection:
php artisan modulite:inspect
php artisan modulite:cache:clear --module="Auth"
Common Errors:
composer dump-autoload).*Panel.php).bootstrap/cache/:
chmod -R 775 bootstrap/cache/
Development Workflow:
modulite:cache --watch to auto-rebuild caches during development.optimize:clear for faster iterations:
php artisan optimize:clear && php artisan modulite:cache
Production Optimization:
modulite:optimize during low-traffic periods:
* * * * * cd /path-to-app && php artisan modulite:optimize >> /dev/null 2>&1
modulite:stats.Extending Functionality:
public function boot()
{
Modulite::extend(function (Discovery $discovery) {
$discovery->registerCustomProvider(CustomProvider::class);
});
}
Modulite::loadModules() to conditionally load modules based on user roles or features.Performance Tuning:
module_paths to reduce scan time.cache_path to a faster storage (e.g., RAM disk):
'cache_path' => '/dev/shm/modulite_cache.php',
Security:
modulite:cache commands to trusted users in app/Console/Kernel.php:
protected $commands = [
\PanicDevs\Modulite\Console\CacheCommand::class => ['cache'],
];
config/modulite.php to prevent directory traversal:
'module_paths' => [app_path('Modules')],
How can I help you explore Laravel packages today?