Installation:
composer require coolsam/filament-modules
php artisan vendor:publish --provider="Coolsam\Modules\FilamentModulesServiceProvider"
Run migrations if needed (php artisan migrate).
First Module Creation:
php artisan module:make Blog --filament
This generates a module skeleton with Filament-specific files (Resources, Widgets, etc.) in Modules/Blog.
Register Module:
In app/Providers/Filament/AdminPanelProvider.php, add:
public function panel(Panel $panel): Panel
{
return $panel
->modules([
\Modules\Blog\BlogModule::class,
]);
}
First Use Case: Create a Filament resource inside the module:
php artisan module:filament-resource Blog Post
This auto-generates a resource in Modules/Blog/Resources/PostResource.php.
Modular Resource Management:
Modules/Blog/Resources/, Modules/Blog/Widgets/).php artisan module:filament-resource and php artisan module:filament-widget for scaffolding.Module-Specific Configuration:
Override Filament’s default config per module via config/filament.php in the module’s root:
'resources' => [
\Modules\Blog\Resources\PostResource::class,
],
Dependency Injection: Inject module services into Filament components:
public function form(Form $form): Form
{
return $form
->schema([
TextInput::make('title')
->required()
->maxLength(255),
])
->model(\Modules\Blog\Models\Post::class);
}
Widget Isolation:
Create module-specific widgets in Widgets/ and register them in the module’s getWidgets() method:
public function getWidgets(): array
{
return [
\Modules\Blog\Widgets\StatsOverview::class,
];
}
Navigation Groups: Group Filament navigation items by module:
public function getNavigationItems(): array
{
return [
\Modules\Blog\Navigation\BlogNavigation::class,
];
}
module:assets-publish Blog) for CSS/JS.php artisan module:migrate Blog
php artisan module:test Blog to run module-specific tests.php artisan module:seed Blog.Namespace Conflicts:
Modules\Blog\) don’t clash with global app namespaces.App\Modules\Blog\).Caching Issues:
php artisan filament:cache-clear
php artisan module:cache-clear
Route Conflicts:
getRoutePrefix():
public function getRoutePrefix(): string
{
return 'blog';
}
Service Provider Order:
AdminPanelProvider in config/app.php.Missing Module Dependencies:
Auth for permissions), ensure dependencies are loaded first:
public function boot()
{
$this->loadModuleDependencies();
}
Check Module Registration:
Verify modules are loaded in filament.php:
'modules' => [
\Modules\Blog\BlogModule::class,
],
Log Module Events:
Use module:event to debug module lifecycle:
php artisan module:event Blog booting
Inspect Published Assets: Check if module assets are published correctly:
php artisan module:assets-publish Blog
Custom Module Bootstrapping:
Override boot() in your module class to run logic after registration:
public function boot()
{
// Register custom Filament policies
Policy::map([
\Modules\Blog\Models\Post::class => \Modules\Blog\Policies\PostPolicy::class,
]);
}
Dynamic Module Loading: Load modules conditionally based on config or environment:
public function getModules(): array
{
return config('filament.modules.enabled') ? [
\Modules\Blog\BlogModule::class,
] : [];
}
Module-Specific Middleware: Attach middleware to module routes:
public function getRouteMiddleware(): array
{
return [
\Modules\Blog\Http\Middleware\VerifyBlogAccess::class,
];
}
API Resource Isolation:
Use module:filament-api-resource to create API-only resources:
php artisan module:filament-api-resource Blog PostApi
Localization: Override Filament translations per module by publishing language files:
php artisan module:lang-publish Blog
Then extend filament.php translations in Modules/Blog/lang/en/filament.php.
How can I help you explore Laravel packages today?