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

Чим broadcast-сповіщення Filament відрізняються від сповіщень у базі даних і як отримувати їх миттєво?

У Filament три способи доставити сповіщення, і вони розв'язують різні задачі:

Спосіб Куди Зберігається Коли отримує
send() поточний користувач, через сесію ні на наступному рендері
sendToDatabase($user) таблиця notifications так при опитуванні (30 с) чи через вебсокет
broadcast($user) вебсокет-канал користувача ні миттєво, якщо сторінка відкрита

Broadcast-сповіщення - тимчасовий «тост», що з'являється в браузері користувача в реальному часі, але ніде не зберігається. Якщо вкладка закрита - сповіщення втрачено.

Notification::make()
    ->title('Експорт готовий')
    ->success()
    ->broadcast($user);

Налаштування (окрім звичайного broadcasting у Laravel - Reverb чи Pusher):

  1. опублікувати конфіг Filament (php artisan vendor:publish --tag=filament-config);
  2. у config/filament.php розкоментувати й заповнити розділ broadcasting.echo;
  3. переконатися, що в .env є потрібні змінні VITE_*;
  4. мати запущені воркер черги (сповіщення ставиться в чергу) і вебсокет-сервер.

Поєднання найкращого з двох світів - сповіщення в базі даних з миттєвою доставкою:

Notification::make()
    ->title('Новий відгук на вакансію')
    ->sendToDatabase($recruiter, isEventDispatched: true);

Запис зберігається в базі (видно в дзвіночку й пізніше), а подія через вебсокет змушує панель одразу підтягнути нові сповіщення, без очікування опитування. Після цього опитування можна вимкнути: databaseNotificationsPolling(null).

Що обирати:

  • результат дії, яку користувач щойно виконав, - send();
  • щось, що користувач має побачити навіть пізніше (призначене завдання, відгук, результат імпорту) - sendToDatabase();
  • миттєва, але неважлива подія для відкритої сторінки (хтось редагує той самий запис) - broadcast().

Пастки:

  • приватні канали авторизуються через routes/channels.php - перевірте, що користувач отримує лише свій канал;
  • черга й вебсокет-сервер - дві окремі точки відмови: без воркера сповіщення не відправиться, без Reverb - не дійде;
  • опитування на сотнях вкладок часто дорожче за один вебсокет-сервер - на великих панелях broadcast окупається.

Докладніше в документації: Broadcast-сповіщення

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