← 使用情境

Filament 面板:即時通知與編輯鎖

一條命令:鈴鐺立刻更新、誰在線、編輯鎖,以及自己更新的表格。

Filament 面板是團隊一整天工作的地方:訂單、工單、內容與審核。預設情況下面板靠輪詢得知變化,所以通知鈴鐺最多晚 30 秒,表格會過時,兩個人也可能互相蓋掉對方的修改。Filament 本來就能透過 Laravel Echo 連到任何相容 Pusher 的服務,我們的 hibira-io/filament 插件用一條命令就幫你打開,支援 Filament 3、4、5。不必自己架 WebSocket 伺服器,也不用 npm 建置。

團隊得到什麼

  • 通知一存進資料庫,鈴鐺就立刻更新,你的 App 現有的每一則通知都適用。
  • 顯示誰也在同一頁的頭像,以及編輯鎖:同一筆資料一次只有一個人編輯。
  • 表格、關聯表和記錄頁在資料變動時自己更新,不論變動來自面板、佇列工作還是 API。
  • 匯入、匯出的進度條,以及團隊聊天頁。
編輯鎖:Mei 正在編輯文章,其他人無法儲存,但可以按「請求編輯」
編輯鎖:Mei 正在編輯文章,其他人無法儲存,但可以按「請求編輯」

用到的功能

  • hibira-io/laravel 提供的 hibira Laravel Broadcasting 連線。
  • Filament 內建的 Laravel Echo,由插件指向 Hibira。
  • 通知、表格、記錄用私人頻道;誰在線與編輯鎖用 Presence 頻道。
  • Channels HTTP API:伺服器在轉移編輯鎖前,用它確認誰還在這筆資料上。
Laravel儲存、通知、匯入
每個請求一則訊息
Hibiraws.hibira.io
WebSocket
Filament 面板鈴鐺、表格、記錄頁

誰可以收聽

Filament 面板POST /broadcasting/auth
canAccessPanel()
Laravel頻道規則
簽章
Hibira
你的 App 在請求或工作結束時把變動送到 Hibira;開著該頁的面板立刻更新

步驟 1:一條命令安裝

composer require hibira-io/filament
php artisan hibira:filament

這條命令會把設定加進 .env 並詢問你的 App ID、key 與 secret,開啟廣播授權路由,建立通知資料表,並把插件加進你的 Panel provider,最後檢查連線與每個面板。隨時可以再執行,它只會補上缺少的部分。記得在 App 頁面的 Allowed origins 加上你網站的網址,瀏覽器才能連線。

步驟 2:通知立刻送達

程式碼不用改。每一則資料庫通知一存入就會更新鈴鐺,包括沒有加 isEventDispatched: true 的通知:

Notification::make()
    ->title('Order #1024 shipped')
    ->success()
    ->sendToDatabase($user);

Filament 透過佇列儲存通知,所以請保持 php artisan queue:work 執行,開發時也可以用 QUEUE_CONNECTION=sync。

步驟 3:誰在線與編輯鎖

hibira:filament 已經打開頭像。要用編輯鎖,在編輯頁加一個 trait:

class EditPost extends EditRecord
{
    use InteractsWithHibiraLock;

    protected static string $resource = PostResource::class;
}

第一個打開記錄的人持有鎖,其他人可以查看並請求編輯。持有人離開後,下一個人幾秒內就會拿到鎖,不需要心跳輪詢。

持有人收到請求,可以先儲存再交出
持有人收到請求,可以先儲存再交出

步驟 4:即時表格與記錄頁

打開 liveTables() 與 liveRecords() 後,表格與記錄頁會為所有開著它們的人更新。一連串的變動,例如匯入一千筆資料,每個請求或佇列工作只送一次,而不是每筆一次。編輯頁會顯示是誰改了記錄,並且只載入被改的欄位,所以你尚未儲存的編輯會保留。

用 query builder 大量更新時不會觸發 model 事件,請自己標記表格:

Order::query()->where('paid', false)->update(['status' => 'cancelled']);

app(\Hibira\Filament\LiveTables::class)->touch(Order::class);
美玲編輯時建宏儲存了文章:頁面會提示,按「載入修改」只帶入他改的欄位
美玲編輯時建宏儲存了文章:頁面會提示,按「載入修改」只帶入他改的欄位

步驟 5:面板的更多功能

匯入 1,000 筆資料:卡片隨每一段前進,表格同時填入
匯入 1,000 筆資料:卡片隨每一段前進,表格同時填入

從 Reverb 或輪詢換過來

如果你的面板已經用 Echo 搭配 Reverb 或 Pusher,插件會替它所在的面板換掉 filament.broadcasting.echo 設定,你自己的事件與頻道規則照常運作。如果面板現在靠輪詢,->databaseNotifications() 會關掉輪詢;想保留作為備援就傳 polling: '60s'。搬遷頁面列出了要檢查的項目。

小提醒

  • 每個環境(本機、測試、正式)各建一個 App,測試事件就不會送到真正的使用者。
  • 用自己 guard 登入的面板,需要用同一個 guard 註冊廣播路由;hibira:filament 遇到時會提醒你。
  • 一連串的變動在每個請求或佇列工作只送出一則訊息,用量很省;各方案內容請看價格。