Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама
Senior Filament

Як влаштований плагін панелі Filament і чим відрізняються його методи register і boot?

Плагін панелі - клас, що реалізує інтерфейс 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 тощо) без власного класу.

Докладніше в документації: Плагіни панелі

Перевір себе

20 випадкових питань за спробу, після завершення - розбір кожної помилки

Схожі питання