bezhansalleh/filament-plugin-essentials
A collection of essentials for Filament plugins: shared helpers, patterns, and base components to speed up building and maintaining Filament extensions. Provides common utilities and sensible defaults so you can ship plugins faster with less boilerplate.
Installation Run:
composer require bezhansalleh/filament-plugin-essentials
Publish the config (if needed) with:
php artisan vendor:publish --provider="BezhanSalleh\FilamentPluginEssentials\FilamentPluginEssentialsServiceProvider"
Basic Setup Add the trait to your Filament plugin class:
use BezhanSalleh\FilamentPluginEssentials\Traits\HasPluginSettings;
use BezhanSalleh\FilamentPluginEssentials\Traits\HasPluginWidgets;
class MyPlugin extends Plugin
{
use HasPluginSettings, HasPluginWidgets;
// ...
}
First Use Case: Plugin Settings
Define a settings page in getSettingsPage():
public static function getSettingsPage(): string
{
return MyPluginSettingsPage::route('/');
}
Create a settings page class extending SettingsPage (Filament’s built-in).
Dynamic Configuration
Use HasPluginSettings to auto-register a settings page. Override getSettings() to define defaults:
public static function getSettings(): array
{
return [
'key' => 'default_value',
'enabled' => true,
];
}
Access settings via plugin()->getSettings() in any plugin class.
Validation
Extend HasPluginSettings and override getSettingsValidationRules():
public static function getSettingsValidationRules(): array
{
return [
'key' => 'required|string',
'enabled' => 'boolean',
];
}
Widget Registration
Use HasPluginWidgets to register widgets in getWidgets():
public static function getWidgets(): array
{
return [
MyWidget::class,
];
}
Widgets appear in Filament’s dashboard under your plugin’s section.
Conditional Widgets Dynamically enable/disable widgets based on settings:
public static function getWidgets(): array
{
$widgets = [MyWidget::class];
if (!$this->getSettings()['enabled']) {
$widgets = [];
}
return $widgets;
}
getPluginAssets() to register assets:
public static function getPluginAssets(): array
{
return [
'css' => ['css/my-plugin.css'],
'js' => ['js/my-plugin.js'],
];
}
Assets are auto-compiled with Laravel Mix/Vite.getRoutes():
public static function getRoutes(): array
{
return [
'prefix' => 'my-plugin',
'middleware' => ['auth', 'verified'],
'routes' => [
'api' => __DIR__.'/../routes/api.php',
],
];
}
Settings Persistence
getSettings() returns an array with all required keys to avoid null values in the DB.plugin()->saveSettings() manually if modifying settings outside the settings page.Widget Caching
php artisan cache:clear) after changes to getWidgets().Asset Loading Order
getPluginAssets(). Dependencies should be listed first.Plugin Initialization
boot() for initialization:
protected static function boot(): void
{
parent::boot();
// Initialize here
}
dd($this->plugin()->getSettings());
webpack.mix.js or vite.config.js).resources/views/vendor/filament-plugin-essentials/).Custom Traits
Extend the provided traits to add logic (e.g., HasPluginPermissions):
trait HasPluginPermissions
{
public function getPermissions(): array
{
return [];
}
}
Event Listeners
Listen to plugin events (e.g., PluginRegistered):
public static function register(): array
{
return [
Plugin::make()
->id('my-plugin')
->name('My Plugin')
->registerUsing(function () {
event(new PluginRegistered());
}),
];
}
Localization
Override getPluginTranslations() to add language support:
public static function getPluginTranslations(): array
{
return [
'en' => __DIR__.'/../resources/lang/en.json',
'fr' => __DIR__.'/../resources/lang/fr.json',
];
}
How can I help you explore Laravel packages today?