Сповіщення в базі даних зберігаються в таблиці notifications Laravel і показуються в панелі в окремому вікні з дзвіночком - навіть якщо користувача не було онлайн у момент відправки.
Налаштування:
php artisan make:notifications-table
php artisan migrate
// панель
$panel
->databaseNotifications()
->databaseNotificationsPolling('30s');
Відправка:
use Filament\Actions\Action;
use Filament\Notifications\Notification;
Notification::make()
->title('Новий відгук на вакансію')
->body("{$candidate->name} відгукнувся на «{$vacancy->title}».")
->actions([
Action::make('open')
->label('Відкрити')
->url(VacancyResource::getUrl('edit', ['record' => $vacancy]))
->markAsRead(),
])
->sendToDatabase($recruiter);
Можна і через звичайний клас сповіщення Laravel, повернувши з toDatabase() результат Notification::make()->...->getDatabaseMessage().
Чому сповіщення не з'являються - типові причини:
- Немає воркера черги. Клас сповіщення Filament реалізує
ShouldQueue, тож запис у базу виконується в черзі. Без запущеногоqueue:work(чи Horizon) сповіщення просто чекають у черзі. - Не ввімкнено
databaseNotifications()у тій панелі, де очікують дзвіночок. - Опитування. Нові сповіщення підтягуються раз на 30 секунд (за замовчуванням). Миттєво - лише з вебсокетами:
sendToDatabase($user, isEventDispatched: true)плюс налаштований Laravel Echo. - PostgreSQL: колонка
dataу міграції має бутиjson(). - UUID у моделі користувача: у міграції потрібні
uuidMorphs('notifiable').
Що варто знати:
- сповіщення адресуються конкретній моделі - щоб повідомити всіх адміністраторів, передайте колекцію:
sendToDatabase(User::admins()->get()); - опитування раз на 30 секунд на кожній відкритій вкладці кожного користувача - теж навантаження; на великих панелях вебсокети вигідніші;
- старі сповіщення варто чистити (планувальником), інакше таблиця росте без меж.