Skip to content

BaseAddon ​

The foundation class for all Filament Twist addons.

Overview ​

BaseAddon provides the core structure for creating addons in Filament Twist. It implements the Filament Plugin interface and provides convenient methods for addon registration and management.

Key Features ​

  • Service Container Integration: Uses Laravel's service container for instantiation
  • Automatic ID Generation: Generates addon ID from class name
  • Filament Plugin Interface: Implements Filament's Plugin contract
  • Panel Boot Hook: Override to register resources, pages, and widgets

Basic Usage ​

Simple Addon ​

php
<?php

namespace App\Addons\UserManagement;

use Twist\Base\BaseAddon;
use Filament\Panel;

class UserManagementAddon extends BaseAddon
{
    public function getId(): string
    {
        return 'user-management';
    }

    public function boot(Panel $panel): void
    {
        $panel->resources([
            Resources\UserResource::class,
        ]);
    }
}

Addon with Migrations ​

php
<?php

namespace App\Addons\UserManagement;

use Twist\Base\BaseAddon;
use Twist\Contracts\HasMigration;
use Filament\Panel;

class UserManagementAddon extends BaseAddon implements HasMigration
{
    public function getId(): string
    {
        return 'user-management';
    }

    public function boot(Panel $panel): void
    {
        $panel->resources([
            Resources\UserResource::class,
        ])->pages([
            Pages\UserSettings::class,
        ])->widgets([
            Widgets\UserStatsWidget::class,
        ]);
    }

    public function pathMigrations(): string
    {
        return __DIR__ . '/Database/Migrations';
    }
}

Addon with API Routes ​

php
<?php

namespace App\Addons\UserManagement;

use Twist\Base\BaseAddon;
use Twist\Contracts\HasMigration;
use Twist\Contracts\HasRouteApi;
use Filament\Panel;

class UserManagementAddon extends BaseAddon implements HasMigration, HasRouteApi
{
    public function getId(): string
    {
        return 'user-management';
    }

    public function boot(Panel $panel): void
    {
        $panel->resources([
            Resources\UserResource::class,
        ]);
    }

    public function pathMigrations(): string
    {
        return __DIR__ . '/Database/Migrations';
    }

    public function pathRouteApi(): string
    {
        return __DIR__ . '/Routes/api.php';
    }
}

Methods ​

make() ​

Static factory method that creates an instance using Laravel's service container.

php
public static function make(): static

Returns: static - Instance of the addon

Example:

php
$addon = UserManagementAddon::make();

getId() ​

Returns the unique identifier for the addon. By default, uses the class basename.

php
public function getId(): string

Returns: string - Unique addon identifier

Example:

php
public function getId(): string
{
    return 'user-management'; // Custom ID
}

boot() ​

Called when the addon is being registered with a Filament panel. Override to register resources, pages, widgets, and middleware.

php
public function boot(Panel $panel): void

Parameters:

  • $panel - The Filament panel instance

Example:

php
public function boot(Panel $panel): void
{
    $panel
        ->resources([
            Resources\UserResource::class,
            Resources\RoleResource::class,
        ])
        ->pages([
            Pages\UserSettings::class,
        ])
        ->widgets([
            Widgets\UserStatsWidget::class,
        ])
        ->middleware([
            Middleware\CheckUserPermissions::class,
        ]);
}

Interfaces ​

Common Interfaces ​

Addons commonly implement these interfaces to provide additional functionality:

HasMigration ​

php
use Twist\Contracts\HasMigration;

class MyAddon extends BaseAddon implements HasMigration
{
    public function pathMigrations(): string
    {
        return __DIR__ . '/Database/Migrations';
    }
}

HasRouteApi ​

php
use Twist\Contracts\HasRouteApi;

class MyAddon extends BaseAddon implements HasRouteApi
{
    public function pathRouteApi(): string
    {
        return __DIR__ . '/Routes/api.php';
    }
}

HasSeed ​

php
use Twist\Contracts\HasSeed;

class MyAddon extends BaseAddon implements HasSeed
{
    public function pathSeed(): string
    {
        return __DIR__ . '/Database/Seeders';
    }
}

Registration ​

Manual Registration ​

php
// In a service provider
use App\Addons\UserManagement\UserManagementAddon;

$panel->plugin(UserManagementAddon::make());

Automatic Discovery ​

Addons can be automatically discovered when placed in the configured addon paths:

php
// config/twist.php
'addons' => [
    'paths' => [
        app_path('Addons'),
        base_path('packages/*/src/Addons'),
    ],
],

Advanced Usage ​

Conditional Registration ​

php
public function boot(Panel $panel): void
{
    if (config('user-management.enabled')) {
        $panel->resources([
            Resources\UserResource::class,
        ]);
    }

    if (auth()->user()?->hasRole('admin')) {
        $panel->pages([
            Pages\AdminSettings::class,
        ]);
    }
}

Environment-Specific Configuration ​

php
public function boot(Panel $panel): void
{
    $resources = [Resources\UserResource::class];
    
    if (app()->environment('local', 'testing')) {
        $resources[] = Resources\TestUserResource::class;
    }
    
    $panel->resources($resources);
}

Service Registration ​

php
public function boot(Panel $panel): void
{
    // Register services
    $this->app->singleton(UserService::class);
    $this->app->bind(UserRepositoryInterface::class, UserRepository::class);
    
    // Register Filament components
    $panel->resources([
        Resources\UserResource::class,
    ]);
}

Best Practices ​

1. Unique IDs ​

Always provide a unique ID for your addon:

php
public function getId(): string
{
    return 'vendor-addon-name';
}

2. Interface Implementation ​

Implement relevant interfaces to declare addon capabilities:

php
class MyAddon extends BaseAddon implements 
    HasMigration, 
    HasRouteApi, 
    HasSeed
{
    // Implementation
}

3. Resource Organization ​

Organize resources logically within the boot method:

php
public function boot(Panel $panel): void
{
    // Core resources
    $panel->resources([
        Resources\UserResource::class,
        Resources\RoleResource::class,
    ]);
    
    // Admin-only resources
    if (auth()->user()?->hasRole('admin')) {
        $panel->resources([
            Resources\AdminResource::class,
        ]);
    }
    
    // Settings and configuration
    $panel->pages([
        Pages\SettingsPage::class,
    ]);
}

4. Dependency Management ​

Handle dependencies gracefully:

php
public function boot(Panel $panel): void
{
    // Check if required services are available
    if (!class_exists(SomeRequiredClass::class)) {
        throw new Exception('Required dependency not found');
    }
    
    $panel->resources([
        Resources\UserResource::class,
    ]);
}

Next Steps ​

Released under the MIT License.