Laravel Notifications

Laravel Notifications

更新於 發佈於 閱讀時間約 8 分鐘

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

以下以發送email通知來舉例用法。


建立通知

  • 建立通知: 比如這邊建立一個文章訂閱通知
$ php artisan make:notification ArticleSubscription

新的通知類別會建立在這個路徑: app/Notifications。

raw-image

預設範例是要透過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。
raw-image
use Illuminate\Notifications\Notifiable;
use Notifiable;
  • 在程式中觸發通知的方式: 如此則會觸發ArticleSubscription中的toMail method。
raw-image
use App\Notifications\ArticleSubscription;
use App\Models\User;

$user = (new User)->find(1);
$user->notify(new ArticleSubscription());


  • Note: 為了方便測試寄信功能,已先將google帳號的「兩步驟驗證」關閉與開啟「低安全性應用程式存取權」。
  • .env中mail設定如下:
raw-image
  • 資料庫中user table第一筆資料如下: 收信者會自動從user table中抓email欄位來寄信。
raw-image

收到的信長這樣:

raw-image

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;
raw-image
  • 記得要設定Queue跟啟動Queue listener,可參考之前寫的這篇:

  Laravel 使用 Queue

  • 如果是使用database driver的話,一樣會塞進jobs表中。
raw-image
  • 想要延遲發送通知的話,可以用->delay():
$user = (new User)->find(1);
$when = now()->addMinutes(10);
$user->notify((new ArticleSubscription())->delay($when));
  • 想指定通知要塞到哪個queue,需在Notification class中定義viaQueues method:
raw-image
public function viaQueues()
{
  return[
    'mail' => 'mail-queue'
  ];
}
raw-image

經過設定後,job不再是塞到default queue中而是指定的mail-queue了!


客製化郵件

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

raw-image
raw-image
raw-image

這樣的mail看起來專業多了!


補充: subject看起來是預設的,可以加上->subject() method來自定義,把Code改成這樣:

public function toMail($notifiable)
{
  return (new MailMessage)
  ->subject('Notification Subject')
  ->view(
    'example_mail', ['name' => 'Vic']
  );
}
raw-image

資料庫通知

  • 先建立通知表:
$ php artisan notifications:table

這會建立CreateNotificationsTable migration:

raw-image
$ php artisan migrate
raw-image

接著把ArticleSubscription 通知code改成這樣:

raw-image

接著程式trigger通知後,就會把資料塞進DB:

raw-image
raw-image
  • 塞到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最新到最舊排序:

raw-image
  • 只想找未讀通知:
$user->unreadNotifications
  • 將user通知標記為已讀:
$user = (new User)->find(1);
$user->unreadNotifications->markAsRead();
raw-image
  • 一個user可能有多則通知,想指定已讀某一則通知:
$user->unreadNotifications[0]->markAsRead();



本筆記參考:

1. https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/695389/
2. https://www.oulub.com/docs/laravel/zh-tw/notifications



avatar-img
Vic Lin的沙龍
21會員
161內容數
留言
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: 範例程式碼: