Плагін панелі - клас, що реалізує інтерфейс Filament\Contracts\Plugin і вміє додати до панелі ресурси, сторінки, віджети, тему, render hooks. Так розповсюджують пакети (блог, журнал активності, ролі), а в проєкті так зручно ділити велику адмінку на модулі.
use Filament\Contracts\Plugin;
use Filament\Panel;
class BlogPlugin implements Plugin
{
protected bool $hasAuthorResource = true;
public static function make(): static
{
return app(static::class);
}
public function getId(): string
{
return 'acme-blog';
}
public function authorResource(bool $condition = true): static
{
$this->hasAuthorResource = $condition;
return $this;
}
public function register(Panel $panel): void
{
$panel
->resources(array_filter([
PostResource::class,
$this->hasAuthorResource ? AuthorResource::class : null,
]))
->pages([BlogSettings::class]);
}
public function boot(Panel $panel): void
{
// код, потрібний лише коли панель справді використовується
}
}
$panel->plugin(BlogPlugin::make()->authorResource(false));
register() проти boot():
register()викликається під час конфігурації панелі. Тут лише описують, що панель містить: ресурси, сторінки, віджети, налаштування. Жодної роботи з базою чи поточним користувачем;boot()виконується через middleware лише тоді, коли запит іде до цієї панелі. Тут доречна логіка, що має діяти тільки всередині панелі: наприклад, глобальні налаштування компонентів черезconfigureUsing(), які не повинні зачепити інші панелі чи решту сайту.
Що варто знати:
getId()має бути унікальним серед усіх плагінів - короткий загальний id на кшталтblogлегко конфліктує;- флюентна конфігурація (як
authorResource(false)) - звичний для користувачів плагіна спосіб налаштування; - плагін, підключений до кількох панелей, отримує окремий виклик з кожною панеллю, тож стан не повинен «перетікати» між ними;
- службовий провайдер пакета (міграції, переклади, view) - окремий від класу плагіна: плагін налаштовує панель, а провайдер - Laravel.
Альтернатива плагіну для невеликих змін - render hooks: вставити Blade-фрагмент у визначене місце панелі (PanelsRenderHook::BODY_END тощо) без власного класу.