Skip to content

Building Module Filament Plugin ​

This guide will walk you through the process of building a module that integrates with Filament.

1. Creating the Plugin Class ​

Create a plugin class in the app/Filament/Plugin directory of your module. The class should implement the Filament Plugin contract:

php
<?php

namespace Modules\YourModule\Filament\Plugin;

use Filament\Contracts\Plugin;
use Filament\Panel;
use Modules\YourModule\Filament\Resources\YourResource;
use Modules\YourModule\Filament\Pages\YourPage;
use Modules\YourModule\Filament\Widgets\YourWidget;

class YourModulePlugin implements Plugin
{
    public function getId(): string
    {
        return 'your-module';
    }

    public function register(Panel $panel): void
    {
        $panel
            ->resources([
                YourResource::class
            ])
            ->pages([
                YourPage::class
            ])
            ->widgets([
                YourWidget::class,
            ]);
    }

    public function boot(Panel $panel): void
    {
        // Additional initialization logic
    }

    public static function make(): static
    {
        return app(static::class);
    }
}

2. Module Configuration ​

In the module.json file of your module, add the plugin class to the filament_plugins array. This allows the Module Manager to automatically register the plugin:

json
{
    "name": "YourModule",
    "alias": "yourmodule",
    "description": "Your module description",
    "keywords": [],
    "priority": 0,
    "providers": ["Modules\\YourModule\\Providers\\YourModuleServiceProvider"],
    "files": [],
    "filament_plugins": [
        "Modules\\YourModule\\Filament\\Plugin\\YourModulePlugin"
    ]
}

3. Plugin Class Breakdown ​

Key methods of the Filament Plugin class:

  • getId(): Returns a unique identifier for the plugin.
  • register(): Configures panel resources, pages, widgets, routes, and other settings.
  • boot(): Provides additional initialization logic.
  • make(): Creates an instance of the plugin using the application container.

4. Advanced Plugin Features ​

Using CanRegisterPanelsProviders ​

If your module needs to register additional panel providers, you can use the CanRegisterPanelsProviders trait:

php
<?php

namespace Modules\YourModule\Filament\Plugin;

use Filament\Contracts\Plugin;
use Filament\Panel;
use ModuleManager\ModuleManager\Concerns\CanRegisterPanelsProviders;

class YourModulePlugin implements Plugin
{
    use CanRegisterPanelsProviders;

    public function getId(): string
    {
        return 'your-module';
    }

    public function register(Panel $panel): void
    {
        // Register resources, pages, etc.
        $panel->resources([
            YourResource::class,
        ]);

        // Register panel providers from your module
        $this->registerPanels([
            YourModulePanelProvider::class,
        ]);
    }

    // ...
}

Conditional Registration ​

You can conditionally register resources, pages, or widgets based on certain conditions:

php
public function register(Panel $panel): void
{
    $resources = [
        YourResource::class,
    ];

    // Only register AdminResource if the user has admin privileges
    if (auth()->user()?->hasRole('admin')) {
        $resources[] = AdminResource::class;
    }

    $panel->resources($resources);
}

5. Best Practices ​

  • Directory Structure: Keep your Filament components organized in appropriate directories:

    • Filament/Resources/ - For resource classes
    • Filament/Pages/ - For page classes
    • Filament/Widgets/ - For widget classes
    • Filament/Plugin/ - For plugin classes
  • Configuration: Use configuration files for settings that might need to be customized by the user.

  • Trait Usage: Leverage Module Manager traits like HasConfigurableItems to make your Filament resources configurable via config files.

  • Multi-Tenancy: If your application uses multi-tenancy, ensure your resources properly respect tenant boundaries using the HasTenant trait on your models.

  • Translations: Use Laravel's translation system for all user-facing text to support multiple languages.

  • Testing: Create tests for your Filament components to ensure they work correctly.