У Filament три способи доставити сповіщення, і вони розв'язують різні задачі:
| Спосіб | Куди | Зберігається | Коли отримує |
|---|---|---|---|
send() |
поточний користувач, через сесію | ні | на наступному рендері |
sendToDatabase($user) |
таблиця notifications |
так | при опитуванні (30 с) чи через вебсокет |
broadcast($user) |
вебсокет-канал користувача | ні | миттєво, якщо сторінка відкрита |
Broadcast-сповіщення - тимчасовий «тост», що з'являється в браузері користувача в реальному часі, але ніде не зберігається. Якщо вкладка закрита - сповіщення втрачено.
Notification::make()
->title('Експорт готовий')
->success()
->broadcast($user);
Налаштування (окрім звичайного broadcasting у Laravel - Reverb чи Pusher):
- опублікувати конфіг Filament (
php artisan vendor:publish --tag=filament-config); - у
config/filament.phpрозкоментувати й заповнити розділbroadcasting.echo; - переконатися, що в
.envє потрібні змінніVITE_*; - мати запущені воркер черги (сповіщення ставиться в чергу) і вебсокет-сервер.
Поєднання найкращого з двох світів - сповіщення в базі даних з миттєвою доставкою:
Notification::make()
->title('Новий відгук на вакансію')
->sendToDatabase($recruiter, isEventDispatched: true);
Запис зберігається в базі (видно в дзвіночку й пізніше), а подія через вебсокет змушує панель одразу підтягнути нові сповіщення, без очікування опитування. Після цього опитування можна вимкнути: databaseNotificationsPolling(null).
Що обирати:
- результат дії, яку користувач щойно виконав, -
send(); - щось, що користувач має побачити навіть пізніше (призначене завдання, відгук, результат імпорту) -
sendToDatabase(); - миттєва, але неважлива подія для відкритої сторінки (хтось редагує той самий запис) -
broadcast().
Пастки:
- приватні канали авторизуються через
routes/channels.php- перевірте, що користувач отримує лише свій канал; - черга й вебсокет-сервер - дві окремі точки відмови: без воркера сповіщення не відправиться, без Reverb - не дійде;
- опитування на сотнях вкладок часто дорожче за один вебсокет-сервер - на великих панелях broadcast окупається.