filament/notifications
Add sleek, real-time notifications to your Filament admin panel. Create toast alerts and in-app messages with customizable titles, bodies, actions, icons, colors, and durations. Send notifications from your Laravel app and keep users informed without leaving the dashboard.
import Aside from "@components/Aside.astro" import AutoScreenshot from "@components/AutoScreenshot.astro"
Before we start, make sure that the Laravel notifications table is added to your database:
php artisan make:notifications-table
If you're using PostgreSQL, make sure that the
datacolumn in the migration is usingjson():$table->json('data').
If you're using UUIDs for your
Usermodel, make sure that yournotifiablecolumn is usinguuidMorphs():$table->uuidMorphs('notifiable').
If you'd like to receive database notifications in a panel, you can enable them in the configuration:
use Filament\Panel;
public function panel(Panel $panel): Panel
{
return $panel
// ...
->databaseNotifications();
}
There are several ways to send database notifications, depending on which one suits you best.
You may use our fluent API:
use Filament\Notifications\Notification;
$recipient = auth()->user();
Notification::make()
->title('Saved successfully')
->sendToDatabase($recipient);
Or, use the notify() method:
use Filament\Notifications\Notification;
$recipient = auth()->user();
$recipient->notify(
Notification::make()
->title('Saved successfully')
->toDatabase(),
);
Laravel sends database notifications using the queue. Ensure your queue is running in order to receive the notifications.
Alternatively, use a traditional Laravel notification class by returning the notification from the toDatabase() method:
use App\Models\User;
use Filament\Notifications\Notification;
public function toDatabase(User $notifiable): array
{
return Notification::make()
->title('Saved successfully')
->getDatabaseMessage();
}
By default, the database notifications trigger is positioned in the topbar. If the topbar is disabled, it is added to the sidebar.
You can choose to always move it to the sidebar by passing a position argument to the databaseNotifications() method in the configuration:
use Filament\Enums\DatabaseNotificationsPosition;
use Filament\Panel;
public function panel(Panel $panel): Panel
{
return $panel
// ...
->databaseNotifications(position: DatabaseNotificationsPosition::Sidebar);
}
Without any setup, new database notifications will only be received when the page is first loaded.
Polling is the practice of periodically making a request to the server to check for new notifications. This is a good approach as the setup is simple, but some may say that it is not a scalable solution as it increases server load.
By default, Livewire polls for new notifications every 30 seconds:
use Filament\Panel;
public function panel(Panel $panel): Panel
{
return $panel
// ...
->databaseNotifications()
->databaseNotificationsPolling('30s');
}
You may completely disable polling if you wish:
use Filament\Panel;
public function panel(Panel $panel): Panel
{
return $panel
// ...
->databaseNotifications()
->databaseNotificationsPolling(null);
}
Websockets are a more efficient way to receive new notifications in real-time. To set up websockets, you must configure it in the panel first.
Once websockets are set up, you can automatically dispatch a DatabaseNotificationsSent event by setting the isEventDispatched parameter to true when sending the notification. This will trigger the immediate fetching of new notifications for the user:
use Filament\Notifications\Notification;
$recipient = auth()->user();
Notification::make()
->title('Saved successfully')
->sendToDatabase($recipient, isEventDispatched: true);
There is a button at the top of the modal to mark all notifications as read at once. You may also add Actions to notifications, which you can use to mark individual notifications as read. To do this, use the markAsRead() method on the action:
use Filament\Actions\Action;
use Filament\Notifications\Notification;
Notification::make()
->title('Saved successfully')
->success()
->body('Changes to the post have been saved.')
->actions([
Action::make('view')
->button()
->markAsRead(),
])
->send();
Alternatively, you may use the markAsUnread() method to mark a notification as unread:
use Filament\Actions\Action;
use Filament\Notifications\Notification;
Notification::make()
->title('Saved successfully')
->success()
->body('Changes to the post have been saved.')
->actions([
Action::make('markAsUnread')
->button()
->markAsUnread(),
])
->send();
You can open the database notifications modal from anywhere by dispatching an open-modal browser event:
<button
x-data="{}"
x-on:click="$dispatch('open-modal', { id: 'database-notifications' })"
type="button"
>
Notifications
</button>
How can I help you explore Laravel packages today?