告別手刻信件!Laravel 11 通知系統 (Notifications) 終極實戰:Email、資料庫到 Slack 全攻略

2026/01/11 | API 串接與自動化, Laravel技術分享, 全端與程式開發

Laravel 11 通知系統終極實戰:效率、擴展與多管道全攻略

厭倦在 Controller 裡手動塞入通知邏輯嗎?在 2025 年,效率就是王道!Laravel 11 通知系統提供了一個統一且強大的抽象層,讓您用一套邏輯搞定 Email、站內信、Slack 等多個管道。透過實作 ShouldQueue 介面,您的應用程式速度將瞬間提升至毫秒等級,徹底實現「關注點分離」。別再讓您的 App 當啞巴了!立即將這些混亂的通知程式碼扔進歷史的垃圾桶,升級至專業的通知架構,讓浪花科技助您打造可擴展的高效能系統!

需要專業協助?

聯絡浪花專案團隊 →

告別手刻信件!Laravel 11 通知系統 (Notifications) 終極實戰:Email、資料庫到 Slack 全攻略

嗨,我是 Eric,浪花科技的資深工程師。如果你還在 Controller 裡面寫 Mail::send(),或者在每一個業務邏輯裡手動塞入資料庫通知的程式碼,那這篇文章就是為你寫的。這就像在 2025 年還在用飛鴿傳書一樣,不是不能用,是太沒效率了!

開發應用程式時,「主動告知使用者發生了什麼事」是提升使用者體驗(UX)的關鍵。無論是訂單成立、密碼重置,還是系統異常警報,Laravel 通知系統(Notifications) 提供了一個優雅、統一且強大的抽象層,讓你用一套邏輯搞定 Email、簡訊、Slack 甚至是資料庫內的站內信。

今天,我們就以 Laravel 11 為背景(但在 Laravel 9/10 也通用),深入探討如何構建一個可維護、可擴展的通知架構。

為什麼你需要 Laravel Notification System?

很多新手工程師(包括當年的我)會問:「直接用 Mail Facade 寄信不就好了嗎?」

當然可以,但當你的產品經理跑來跟你說:「Eric,這個訂單通知除了寄信,現在還要在網站右上角顯示小鈴鐺通知,老闆說他也要在 Slack 收到通知。」這時候如果你是用手刻的方式,你就得去改 Controller,把程式碼弄得像義大利麵一樣亂。

Laravel Notifications 的核心優勢在於「關注點分離」

  • 多管道支援 (Multi-channel): 一個通知類別,同時發送到 Email、Database、SMS (Nexmo/Twilio)、Slack、Discord 等。
  • 易於佇列 (Queueable): 加上 ShouldQueue 介面,自動將發送任務丟到背景執行,不會卡住使用者的頁面載入。
  • 高度客製化: 可以針對不同管道回傳不同的格式內容。

實戰演練:建立你的第一個通知

假設我們要通知使用者「訂單已出貨」。首先,我們使用 Artisan 指令建立一個 Notification 類別。

php artisan make:notification OrderShipped

這會在 app/Notifications 目錄下產生一個檔案。讓我們來看看它的結構,並稍微改造一下:


<?php

namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;
use App\Models\Order;

class OrderShipped extends Notification implements ShouldQueue
{
    use Queueable;

    protected $order;

    // 注入訂單資料
    public function __construct(Order $order)
    {
        $this->order = $order;
    }

    // 指定發送管道
    public function via(object $notifiable): array
    {
        // 可以根據使用者偏好動態決定
        return ['mail', 'database', 'slack'];
    }

    // 定義 Email 內容
    public function toMail(object $notifiable): MailMessage
    {
        return (new MailMessage)
                    ->subject('您的訂單 #' . $this->order->id . ' 已出貨')
                    ->greeting('你好,' . $notifiable->name)
                    ->line('您的訂單已經交由物流運送中。')
                    ->action('查看訂單詳情', url('/orders/' . $this->order->id))
                    ->line('感謝您的購買!');
    }

    // 定義資料庫通知內容 (站內信)
    public function toArray(object $notifiable): array
    {
        return [
            'order_id' => $this->order->id,
            'amount' => $this->order->total,
            'message' => '您的訂單 #' . $this->order->id . ' 已出貨',
        ];
    }
}

如何觸發通知?

在你的 Controller 或 Service 中,只需要一行程式碼:


use App\Notifications\OrderShipped;

// 方法一:透過 User 模型 (如果 User 有使用 Notifiable Trait)
$user->notify(new OrderShipped($order));

// 方法二:使用 Notification Facade (適用於發送給多人)
use Illuminate\Support\Facades\Notification;
Notification::send($users, new OrderShipped($order));

看到了嗎?Controller 變得非常乾淨,發送邏輯完全被封裝起來了。

深入核心:資料庫通知 (Database Notifications)

這是我最喜歡的功能之一。很多網站都有「小鈴鐺」功能,顯示「你有 3 則未讀訊息」。自己設計資料表雖然不難,但 Laravel 直接幫你做好了。

首先,建立通知資料表(如果你是 Laravel 11 全新安裝,預設可能已經處理好了,或者需要執行以下指令):

php artisan make:notifications-table
php artisan migrate

這會建立一個 notifications 表格,裡面有 type (通知類別), notifiable_type (通常是 User Model), data (JSON 格式的內容) 等欄位。

當你發送通知時,toArray 方法回傳的陣列會被轉成 JSON 存入資料庫。接著,你可以在前端這樣撈取資料:


// 取得所有通知
$notifications = $user->notifications;

// 取得「未讀」通知
$unreadNotifications = $user->unreadNotifications;

// 標記為已讀
$user->unreadNotifications->markAsRead();

身為工程師,這真的省去我們手寫 is_read 邏輯的大量時間。

進階應用:Slack 與 On-Demand Notifications

有些通知不是給使用者的,是給我們開發者或營運團隊看的。例如:「系統發生嚴重錯誤」「有一筆大額訂單成立」

這時候我們不需要一個 User Model,我們可以使用 On-Demand Notifications 直接發送到特定的路由(例如 Slack Webhook URL)。


use Illuminate\Support\Facades\Notification;
use App\Notifications\ServerAlert;

Notification::route('slack', 'https://hooks.slack.com/services/...')
            ->notify(new ServerAlert($errorMsg));

當然,你需要在通知類別中定義 toSlack 方法。這對於建立即時監控系統非常有用,不需要依賴昂貴的第三方監控服務,自己就能搞定基礎警報。

效能優化:為什麼一定要用 Queue?

這點我要特別囉嗦一下。發送 Email 或呼叫 Slack API 都是網路請求(Network I/O),非常耗時。如果你不使用 Queue(佇列),使用者按下「送出訂單」後,可能要轉圈圈轉個 3-5 秒才能看到結果,這在使用者體驗上是不及格的。

只要在 Notification 類別上實作 ShouldQueue 介面(如上面的程式碼範例),Laravel 就會自動將這個通知任務丟到背景處理。你的 Controller 回應速度會瞬間回到毫秒等級。

Eric 的小提醒: 記得在伺服器上設定 Supervisor 來執行 php artisan queue:work,否則你的通知會一直躺在隊列裡出不去喔!

總結:別再讓你的 App 當啞巴

Laravel 通知系統不僅僅是為了寄信,它是一個完整的訊息派發中心。透過良好的架構設計,你可以讓你的應用程式具備「主動溝通」的能力,無論是對使用者還是對開發團隊。

下次開發新功能時,別再想著「這裡寫個 mail function 好了」,試試看 php artisan make:notification,你會愛上這種整潔的開發體驗。

推薦閱讀

想讓你的 Laravel 技能更上一層樓?這裡有幾篇我精選的實戰文章,強烈建議延伸閱讀:

你的 Laravel 專案通知邏輯混亂,難以維護嗎?或者需要整合複雜的第三方訊息平台?

立即聯繫浪花科技,讓我們為您打造高效能的系統架構!

常見問題 (FAQ)

Q1: 為什麼要使用 Notification 類別而不是直接在 Controller 寄信?

使用 Notification 類別可以實現「關注點分離」,將發送邏輯從 Controller 中抽離,使程式碼更乾淨、易於維護。同時,它支援多管道發送(Email, SMS, Slack 等)和佇列(Queue)功能,能顯著提升系統擴展性與效能。

Q2: 資料庫通知 (Database Notifications) 的 data 欄位長度有限制嗎?

預設情況下,data 欄位是 text 類型,可以儲存相當大量的 JSON 資料。但在設計時,建議只儲存關鍵資訊(如 ID、金額、簡短訊息),避免存入過大或敏感的資料,以免影響資料庫效能。

Q3: 如果我沒有 User Model,還可以使用通知系統嗎?

可以!Laravel 支援 On-Demand Notifications。你可以使用 Notification::route('mail', 'email@example.com')->notify(...) 的方式,直接指定接收者資訊,而不需要建立使用者模型,這在發送系統警報給管理員時非常有用。

 
立即諮詢,索取免費1年網站保固