Skip to main content

什麼是 Notification

Laravel 的通知(Notification)系統,是一套透過統一 API 將通知發送到郵件、SMS、Slack、資料庫等多種傳遞頻道的機制。 Mail 與 Notification 的差異 像帳單付款完成通知這種需要同時透過多種頻道發送相同通知的情況,就適合使用 Notification。

建立 Notification 類別

使用 make:notification Artisan 指令來產生類別。
產生的類別會放在 app/Notifications/ 目錄下。類別中包含 via() 方法,以及對應各頻道的訊息產生方法。

通知的發送方式

使用 Notifiable Trait

App\Models\User 預設就已包含 Notifiable trait。可透過 notify() 方法發送通知。
Notifiable trait 不限於 User 模型,可加入任何模型中使用。

使用 Notification Facade

若要同時發送給多位使用者,可使用 Notification facade。
若要立即發送(跳過佇列),請使用 sendNow()。

指定傳遞頻道

在 via() 方法中以陣列形式回傳所要使用的頻道。
也可以依據使用者的偏好切換頻道。
主要可用的頻道如下。

郵件頻道的通知

在 toMail() 方法中回傳 MailMessage 實體。
MailMessage 的主要方法如下。 若要通知錯誤,可加上 error() 方法,按鈕會變為紅色。

Markdown 通知郵件

也可以使用 Markdown 格式的豐富郵件。使用 --markdown 選項來產生類別。
以 toMarkdownMail() 取代 toMail()。

資料庫頻道的通知

使用資料庫頻道可將通知儲存至 DB,並顯示於應用程式的 UI 上。

準備資料表

首先建立 notifications 資料表。

定義 toArray 方法

在 toArray() 方法中以陣列形式回傳要儲存的資料。
這些資料會以 JSON 格式儲存到 notifications 資料表的 data 欄位中。

取得通知

可透過 Notifiable trait 提供的 notifications 關聯來取得通知。
若只想取得未讀通知,可使用 unreadNotifications。

標記為已讀

使用 markAsRead() 將通知標記為已讀。

通知的佇列處理

若發送通知需要較多時間,可加入 ShouldQueue 介面與 Queueable trait 改為佇列處理。透過 make:notification 產生的類別預設就已匯入這些內容。
實作 ShouldQueue 之後,只要呼叫 notify() 就會自動被推入佇列。
也可延遲發送。

同時發送至多個頻道

只要在 via() 方法中回傳多個頻道,並分別定義各自的方法,就能同時將相同的通知發送至多個頻道。

隨選通知

若想發送通知給在應用程式中沒有帳號的使用者,可使用 Notification::route()。

總結

最後修改於 2026年8月2日