跳到主要内容
版本:4.x

概述

简介

通知通过 Fluent API 构建的 Notification 对象发送。调用 Notification 对象的 send() 方法将调度通知并将其显示在你的应用中。由于会话用于闪烁通知,因此它们可以从代码中的任何位置发送,包括 JavaScript,而不仅仅是 Livewire 组件。

<?php

namespace App\Livewire;

use Filament\Notifications\Notification;
use Livewire\Component;

class EditPost extends Component
{
public function save(): void
{
// ...

Notification::make()
->title('Saved successfully')
->success()
->send();
}
}
Success notification

设置标题

通知的主要信息显示在标题中。你可以按如下方式设置标题:

use Filament\Notifications\Notification;

Notification::make()
->title('Saved successfully')
->send();

标题文本可以包含基本的、安全的 HTML 元素。要使用 Markdown 生成安全的 HTML,可以使用 Str::markdown() 辅助函数: title(Str::markdown('Saved **successfully**'))

或者使用 JavaScript:

new FilamentNotification()
.title('Saved successfully')
.send()

设置图标

可选地,通知可以有一个图标,显示在内容前面。你还可以设置图标的颜色,默认为灰色:

use Filament\Notifications\Notification;

Notification::make()
->title('Saved successfully')
->icon('heroicon-o-document-text')
->iconColor('success')
->send();

或者使用 JavaScript:

new FilamentNotification()
.title('Saved successfully')
.icon('heroicon-o-document-text')
.iconColor('success')
.send()
Notification with icon

通知通常具有诸如 successwarningdangerinfo 之类的状态。无需手动设置相应的图标颜色,你可以使用 status() 方法传递状态。你也可以使用专用的 success()warning()danger()info() 方法。因此,可以将上述示例整理如下:

use Filament\Notifications\Notification;

Notification::make()
->title('Saved successfully')
->success()
->send();

或者使用 JavaScript:

new FilamentNotification()
.title('Saved successfully')
.success()
.send()
Notifications with various statuses

设置背景颜色

默认情况下,通知没有背景颜色。你可能需要通过设置颜色来为通知提供额外的上下文,如下所示:

use Filament\Notifications\Notification;

Notification::make()
->title('Saved successfully')
->color('success')
->send();

或者使用 JavaScript:

new FilamentNotification()
.title('Saved successfully')
.color('success')
.send()
Notification with background color

设置持续时间

默认情况下,通知会显示 6 秒,然后自动关闭。你可以指定自定义持续时间值(以毫秒为单位),如下所示:

use Filament\Notifications\Notification;

Notification::make()
->title('Saved successfully')
->success()
->duration(5000)
->send();

或者使用 JavaScript:

new FilamentNotification()
.title('Saved successfully')
.success()
.duration(5000)
.send()

如果你想要将持续时间设置为秒而不是毫秒,可以这样:

use Filament\Notifications\Notification;

Notification::make()
->title('Saved successfully')
->success()
->seconds(5)
->send();

或者使用 JavaScript:

new FilamentNotification()
.title('Saved successfully')
.success()
.seconds(5)
.send()

你可能希望某些通知不要自动关闭,而是需要用户手动关闭。这可以通过将通知设置为持久化来实现:

use Filament\Notifications\Notification;

Notification::make()
->title('Saved successfully')
->success()
->persistent()
->send();

或者使用 JavaScript:

new FilamentNotification()
.title('Saved successfully')
.success()
.persistent()
.send()

设置正文

其他通知文本可以在 body() 中显示:

use Filament\Notifications\Notification;

Notification::make()
->title('Saved successfully')
->success()
->body('Changes to the post have been saved.')
->send();

正文可以包含基本的、安全的 HTML 元素。要使用 Markdown 生成安全的 HTML,可以使用 Str::markdown() 辅助函数: body(Str::markdown('Changes to the **post** have been saved.'))

或者使用 JavaScript:

new FilamentNotification()
.title('Saved successfully')
.success()
.body('Changes to the post have been saved.')
.send()
Notification with body text

将 Action 添加到通知

通知支持 Action,这些按钮会在通知内容下方渲染。它们可以打开 URL 或调度 Livewire 事件。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(),
Action::make('undo')
->color('gray'),
])
->send();

或者使用 JavaScript:

new FilamentNotification()
.title('Saved successfully')
.success()
.body('Changes to the post have been saved.')
.actions([
new FilamentNotificationAction('view')
.button(),
new FilamentNotificationAction('undo')
.color('gray'),
])
.send()
Notification with actions

你可以在这里了解有关如何设置操作按钮样式的更多信息。

从通知 Action 中打开 URL

点击操作(Action)时,你可以选择在新标签页中打开 URL:

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()
->url(route('posts.show', $post), shouldOpenInNewTab: true),
Action::make('undo')
->color('gray'),
])
->send();

或者使用 JavaScript:

new FilamentNotification()
.title('Saved successfully')
.success()
.body('Changes to the post have been saved.')
.actions([
new FilamentNotificationAction('view')
.button()
.url('/view')
.openUrlInNewTab(),
new FilamentNotificationAction('undo')
.color('gray'),
])
.send()

通过通知 Action 调度 Livewire 事件

有时你希望在单击通知操作(Action)时执行其他代码。这可以通过设置 Livewire 事件来实现,该事件应在点击该操作(Action)时触发。你可以选择传递一个数据数组,该数组将作为 Livewire 组件事件监听器的参数使用:

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()
->url(route('posts.show', $post), shouldOpenInNewTab: true),
Action::make('undo')
->color('gray')
->dispatch('undoEditingPost', [$post->id]),
])
->send();

你也可以使用 dispatchSelfdispatchTo

Action::make('undo')
->color('gray')
->dispatchSelf('undoEditingPost', [$post->id])

Action::make('undo')
->color('gray')
->dispatchTo('another_component', 'undoEditingPost', [$post->id])

或者使用 JavaScript:

new FilamentNotification()
.title('Saved successfully')
.success()
.body('Changes to the post have been saved.')
.actions([
new FilamentNotificationAction('view')
.button()
.url('/view')
.openUrlInNewTab(),
new FilamentNotificationAction('undo')
.color('gray')
.dispatch('undoEditingPost'),
])
.send()

类似地,dispatchSelfdispatchTo 也可以在 JavaScript 中使用:

new FilamentNotificationAction('undo')
.color('gray')
.dispatchSelf('undoEditingPost')

new FilamentNotificationAction('undo')
.color('gray')
.dispatchTo('another_component', 'undoEditingPost')

在 Action 中关闭通知

打开 URL 或从操作(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()
->url(route('posts.show', $post), shouldOpenInNewTab: true),
Action::make('undo')
->color('gray')
->dispatch('undoEditingPost', [$post->id])
->close(),
])
->send();

或者使用 JavaScript:

new FilamentNotification()
.title('Saved successfully')
.success()
.body('Changes to the post have been saved.')
.actions([
new FilamentNotificationAction('view')
.button()
.url('/view')
.openUrlInNewTab(),
new FilamentNotificationAction('undo')
.color('gray')
.dispatch('undoEditingPost')
.close(),
])
.send()

使用 JavaScript 对象

JavaScript 对象(FilamentNotificationFilamentNotificationAction)已分配给 window.FilamentNotificationwindow.FilamentNotificationAction,因此它们可在页面脚本中使用。

你也可以将它们导入到捆绑的 JavaScript 文件中:

import { Notification, NotificationAction } from '../../vendor/filament/notifications/dist/index.js'

// ...

使用 JavaScript 关闭通知

通知发送后,你可以通过在窗口上调度名为 close-notification 的浏览器事件来按需关闭通知。

该事件需要包含你发送的通知的 ID。要获取该 ID,你可以使用 Notification 对象上的 getId() 方法:

use Filament\Notifications\Notification;

$notification = Notification::make()
->title('Hello')
->persistent()
->send()

$notificationId = $notification->getId()

要关闭通知,你可以从 Livewire 调度事件:

$this->dispatch('close-notification', id: $notificationId);

或者使用 JavaScript,本例使用了 Alpine.js:

<button x-on:click="$dispatch('close-notification', { id: notificationId })" type="button">
Close Notification
</button>

如果你能够检索通知 ID,将其持久化,然后使用它来关闭通知,那么推荐使用这种方法,因为 ID 是唯一生成的,不会有关闭错误通知的风险。但是,如果无法持久化随机 ID,你可以在发送通知时传入自定义 ID:

use Filament\Notifications\Notification;

Notification::make('greeting')
->title('Hello')
->persistent()
->send()

在这种情况下,你可以通过使用自定义 ID 调度事件来关闭通知:

<button x-on:click="$dispatch('close-notification', { id: 'greeting' })" type="button">
Close Notification
</button>

请注意,如果你使用同一个 ID 发送多个通知,可能会遇到意外的副作用,因此建议使用随机 ID。

通知位置

你可以在服务提供者或中间件中通过调用 Notifications::alignment()Notifications::verticalAlignment() 来配置通知的对齐方式。你可以传递 Alignment::StartAlignment::CenterAlignment::EndVerticalAlignment::StartVerticalAlignment::CenterVerticalAlignment::End 作为参数:

use Filament\Notifications\Livewire\Notifications;
use Filament\Support\Enums\Alignment;
use Filament\Support\Enums\VerticalAlignment;

Notifications::alignment(Alignment::Start);
Notifications::verticalAlignment(VerticalAlignment::End);