Laravel Notifications

閱讀時間約 8 分鐘
Laravel Notifications(通知),是用來通知使用者應用程式訊息的功能,比如付款完成發送email或簡訊通知使用者,文章被訂閱通知等等。Notifications甚至還可以把通知訊息塞進DB,可以用來顯示在後台報表頁面中。
以下以發送email通知來舉例用法。

建立通知

  • 建立通知: 比如這邊建立一個文章訂閱通知
$ php artisan make:notification ArticleSubscription
新的通知類別會建立在這個路徑: app/Notifications。
預設範例是要透過email通知的,via method裡面定義要通過什麼來通知,由於是要通過email來進行通知,因此要定義toMail method,裡面實作寄信功能。如果是要通知到DB則要定義toDatabase method。
假如除了email也要通過DB來通知,via method可以改成這樣:
return ['mail','database'];
則需要有toDatabase method:
public function toDatabase($notifiable){
}

發送通知

通知有兩種方式可以發送。
  1. 使用Notifiable的notify method發送通知:
  • 在Model設定use Notifiable。
use Illuminate\Notifications\Notifiable;
use Notifiable;
  • 在程式中觸發通知的方式: 如此則會觸發ArticleSubscription中的toMail method。
use App\Notifications\ArticleSubscription;
use App\Models\User;
$user = (new User)->find(1);
$user->notify(new ArticleSubscription());
  • Note: 為了方便測試寄信功能,已先將google帳號的「兩步驟驗證」關閉與開啟「低安全性應用程式存取權」。
  • .env中mail設定如下:
  • 資料庫中user table第一筆資料如下: 收信者會自動從user table中抓email欄位來寄信。
收到的信長這樣:
2. 通過Notification facade發送通知:
如下範例,這種方式可以一次發給多個user。
use App\Models\User;
use Notification;
use App\Notifications\ArticleSubscription;
$users = (new User)->get();
Notification::send($users, new ArticleSubscription());
注意,這種方式Model中還是一樣要use Notifiable;

結合Queue

在某些需要時間處理的狀況下,把job加入Queue中會是比較好的做法,通知想要結合Queue,可以在class中添加ShouldQueue界面和Queueable特徵:
建立Notification的時候就已經引用Queueable跟ShouldQueue了,需再加入implements ShouldQueue。
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
implements ShouldQueue
use Queueable;
  • 記得要設定Queue跟啟動Queue listener,可參考之前寫的這篇:
  • 如果是使用database driver的話,一樣會塞進jobs表中。
  • 想要延遲發送通知的話,可以用->delay():
$user = (new User)->find(1);
$when = now()->addMinutes(10);
$user->notify((new ArticleSubscription())->delay($when));
  • 想指定通知要塞到哪個queue,需在Notification class中定義viaQueues method:
public function viaQueues()
{
  return[
    'mail' => 'mail-queue'
  ];
}
經過設定後,job不再是塞到default queue中而是指定的mail-queue了!

客製化郵件

一般為了呈現給user專業的感覺,會使用view method來寄信,在blade模板中可以自由寫html/css,達到客製化的目的,第二個參數則是把變數往下帶。
這樣的mail看起來專業多了!

補充: subject看起來是預設的,可以加上->subject() method來自定義,把Code改成這樣:
public function toMail($notifiable)
{   
  return (new MailMessage)
  ->subject('Notification Subject')
  ->view(
    'example_mail', ['name' => 'Vic']
  );
}

資料庫通知

  • 先建立通知表:
$ php artisan notifications:table
這會建立CreateNotificationsTable migration:
$ php artisan migrate
接著把ArticleSubscription 通知code改成這樣:
接著程式trigger通知後,就會把資料塞進DB:
  • 塞到db的json data其實就是被儲存在data欄位。
  • notifiable_id其實就是user_id(因為是用User Model來通知的)。
  • 若是要結合Queue跟toMail一樣用法,不再贅述。

  • 可以直接透過user找出通知:
$user = (new User)->find(1);
foreach ($user->notifications as $notification) {
  //$notification->type
  //$notification->data
  ...
}
$user->notifications就可以找出這個user所有的通知: 預設會按照created_at最新到最舊排序:
  • 只想找未讀通知:
$user->unreadNotifications
  • 將user通知標記為已讀:
$user = (new User)->find(1);
$user->unreadNotifications->markAsRead();
  • 一個user可能有多則通知,想指定已讀某一則通知:
$user->unreadNotifications[0]->markAsRead();
即將進入廣告,捲動後可繼續閱讀
為什麼會看到廣告
avatar-img
21會員
161內容數
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Vic Lin的沙龍 的其他內容
Composer是PHP的軟體包管理系統,它提供用於管理PHP軟體和依賴庫關係的標準格式。(引用自維基百科) composer install composer update 這個指令會更新composer.json中指定的套件版本,比如在require中這樣寫: 但如果是這樣: 本筆記參考:
當伺服器需要處理一些比較花時間的任務時(如發送Email、上傳影片等等),讓user等待直到執行完畢,是個很不明智的選擇,這時候就很適合使用Queue,讓工作在背景執行,使用者就能立刻做下一件事,不必在那邊等待。 .env: QUEUE_CONNECTION預設是sync 改成database:
建立middleware指令: 假設建立一個Test middleware: 新增的middleware檔案會在app/Http/Middleware路徑中。 註冊Middleware: Global Middleware: 2. Route Middleware route group用法如下:
Laravel 提供了快速套用軟刪除的方法,直接在Model中加上use SoftDeletes即可: 接著在程式中,假設要把文章1刪除,可以直接這樣寫: 另外,如果我再執行一次上述的Article::find(1)->delete(); 會發現有error: 所以上述改成這樣:
如上篇,使用Migration來做DB版本控制,但是會發現開發過程中若是要建立測試資料,要進DB一筆一筆手動新增或執行預先寫好的insert sql,其實有點麻煩,使用Laravel提供的Seeder功能,就可以解決這個問題。 指令如下,假設建立一個user table seeder:
在Laravel中除了用Validator來驗證資料,還可以用Form Request Validation,建立一個驗證class,在request進入controller之前,會先在這邊做驗證,若驗證失敗則不會繼續執行Controller。 建立form request: 範例程式碼:
Composer是PHP的軟體包管理系統,它提供用於管理PHP軟體和依賴庫關係的標準格式。(引用自維基百科) composer install composer update 這個指令會更新composer.json中指定的套件版本,比如在require中這樣寫: 但如果是這樣: 本筆記參考:
當伺服器需要處理一些比較花時間的任務時(如發送Email、上傳影片等等),讓user等待直到執行完畢,是個很不明智的選擇,這時候就很適合使用Queue,讓工作在背景執行,使用者就能立刻做下一件事,不必在那邊等待。 .env: QUEUE_CONNECTION預設是sync 改成database:
建立middleware指令: 假設建立一個Test middleware: 新增的middleware檔案會在app/Http/Middleware路徑中。 註冊Middleware: Global Middleware: 2. Route Middleware route group用法如下:
Laravel 提供了快速套用軟刪除的方法,直接在Model中加上use SoftDeletes即可: 接著在程式中,假設要把文章1刪除,可以直接這樣寫: 另外,如果我再執行一次上述的Article::find(1)->delete(); 會發現有error: 所以上述改成這樣:
如上篇,使用Migration來做DB版本控制,但是會發現開發過程中若是要建立測試資料,要進DB一筆一筆手動新增或執行預先寫好的insert sql,其實有點麻煩,使用Laravel提供的Seeder功能,就可以解決這個問題。 指令如下,假設建立一個user table seeder:
在Laravel中除了用Validator來驗證資料,還可以用Form Request Validation,建立一個驗證class,在request進入controller之前,會先在這邊做驗證,若驗證失敗則不會繼續執行Controller。 建立form request: 範例程式碼:
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
轉移自 LogDown 原文日期 May 30, 2014 10:14  之前介紹過用 Parse 來做 push,這次換成另一家服務廠商。 Lightspeed 官網: http://www.lightspeedmbs.com/。 它是由 arrownock 延伸而來的,專職於推播和即時訊息
Thumbnail
轉移自 LogDown 原文日期 May 29, 2014 13:34,現今 Parse 官方 server 已關閉,僅提供 SDK 自架 Server  Parse 官網: https://parse.com/ 它提供的不只有推播訊息,還有其他功能,例如雲端資料建置,這會在下次介紹。 SDK 和官
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
轉移自 LogDown 原文日期 May 30, 2014 10:14  之前介紹過用 Parse 來做 push,這次換成另一家服務廠商。 Lightspeed 官網: http://www.lightspeedmbs.com/。 它是由 arrownock 延伸而來的,專職於推播和即時訊息
Thumbnail
轉移自 LogDown 原文日期 May 29, 2014 13:34,現今 Parse 官方 server 已關閉,僅提供 SDK 自架 Server  Parse 官網: https://parse.com/ 它提供的不只有推播訊息,還有其他功能,例如雲端資料建置,這會在下次介紹。 SDK 和官