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
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
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
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.
public static function make(): staticReturns: static - Instance of the addon
Example:
$addon = UserManagementAddon::make();getId()
Returns the unique identifier for the addon. By default, uses the class basename.
public function getId(): stringReturns: string - Unique addon identifier
Example:
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.
public function boot(Panel $panel): voidParameters:
$panel- The Filament panel instance
Example:
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
use Twist\Contracts\HasMigration;
class MyAddon extends BaseAddon implements HasMigration
{
public function pathMigrations(): string
{
return __DIR__ . '/Database/Migrations';
}
}HasRouteApi
use Twist\Contracts\HasRouteApi;
class MyAddon extends BaseAddon implements HasRouteApi
{
public function pathRouteApi(): string
{
return __DIR__ . '/Routes/api.php';
}
}HasSeed
use Twist\Contracts\HasSeed;
class MyAddon extends BaseAddon implements HasSeed
{
public function pathSeed(): string
{
return __DIR__ . '/Database/Seeders';
}
}Registration
Manual Registration
// 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:
// config/twist.php
'addons' => [
'paths' => [
app_path('Addons'),
base_path('packages/*/src/Addons'),
],
],Advanced Usage
Conditional Registration
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
public function boot(Panel $panel): void
{
$resources = [Resources\UserResource::class];
if (app()->environment('local', 'testing')) {
$resources[] = Resources\TestUserResource::class;
}
$panel->resources($resources);
}Service Registration
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:
public function getId(): string
{
return 'vendor-addon-name';
}2. Interface Implementation
Implement relevant interfaces to declare addon capabilities:
class MyAddon extends BaseAddon implements
HasMigration,
HasRouteApi,
HasSeed
{
// Implementation
}3. Resource Organization
Organize resources logically within the boot method:
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:
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,
]);
}Related Classes
- BaseModel - For addon models
- BaseService - For addon services
- BaseAction - For addon actions
- BaseMigration - For addon migrations