通知
はじめに
Laravel は メールの送信 をサポートするだけでなく、メール、SMS(Vonage、以前は Nexmo として知られていました)、Slack を含むさまざまな配信チャンネルを介して通知を送信するためのサポートも提供しています。さらに、コミュニティによって作成されたさまざまな通知チャンネル が作成され、数十種類の異なるチャンネルを介して通知を送信することができます!通知はデータベースに保存されることもあり、Web インターフェースで表示することができます。
通常、通知はアプリケーションで発生したことをユーザーに通知するための短い情報メッセージであるべきです。たとえば、請求アプリケーションを作成している場合、メールおよびSMSチャンネルを介してユーザーに「請求書が支払われました」という通知を送信するかもしれません。
通知の生成
Laravel では、各通知は通常 app/Notifications
ディレクトリに保存される単一のクラスで表されます。アプリケーションでこのディレクトリが表示されない場合でも心配しないでください - make:notification
Artisan コマンドを実行すると自動的に作成されます:
php artisan make:notification InvoicePaid
このコマンドは新しい通知クラスを app/Notifications
ディレクトリに配置します。各通知クラスには via
メソッドと toMail
や toDatabase
などのメッセージ構築メソッドが含まれており、その特定のチャンネル向けに通知をメッセージに変換します。
通知の送信
Notifiable トレイトの使用
通知は Notifiable
トレイトの notify
メソッドを使用するか、Notification
ファサード を使用して送信することができます。Notifiable
トレイトは、アプリケーションの App\Models\User
モデルにデフォルトで含まれています:
<?php
namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable
{
use Notifiable;
}
このトレイトによって提供される notify
メソッドは、通知インスタンスを受け取ることを期待しています。
use App\Notifications\InvoicePaid;
$user->notify(new InvoicePaid($invoice));
モデルのいずれかに Notifiable
トレイトを使用できます。User
モデルにのみ含める必要はありません。
通知ファサードの使用
代わりに、Notification
ファサードを介して通知を送信することもできます。このアプローチは、ユーザーのコレクションなどの複数の通知可能なエンティティに通知を送信する必要がある場合に便利です。ファサードを使用して通知を送信するには、すべての通知可能なエンティティと通知インスタンスを send
メソッドに渡します:
use Illuminate\Support\Facades\Notification;
Notification::send($users, new InvoicePaid($invoice));
sendNow
メソッドを使用して通知をすぐに送信することもできます。このメソッドは、通知が ShouldQueue
インターフェースを実装していても、通知をすぐに送信します:
Notification::sendNow($developers, new DeploymentCompleted($deployment));
配信チャネルの指定
すべての通知クラスには、通知が配信されるチャネルを決定する via
メソッドがあります。通知は mail
、database
、broadcast
、vonage
、slack
チャネルで送信できます。
Telegram や Pusher などの他の配信 チャネルを使用したい場合は、コミュニティ主導の Laravel Notification Channels website をチェックしてください。
via
メソッドは $notifiable
インスタンスを受け取ります。これは通知が送信されるクラスのインスタンスになります。通知がどのチャネルに配信されるかを決定するために $notifiable
を使用できます:
/**
* Get the notification's delivery channels.
*
* @return array<int, string>
*/
public function via(object $notifiable): array
{
return $notifiable->prefers_sms ? ['vonage'] : ['mail', 'database'];
}
通知のキューイング
通知をキューに入れる前に、キューを設定し、ワーカーを 起動する必要があります。
通知の送信には時間がかかる場合があります。特に、チャネルが通知を配信するために外部API呼び出しを行う必要がある場合は、アプリケーションの応答時間を短縮するために、通知をキューに入れておくことがお勧めです。ShouldQueue
インターフェースと Queueable
トレイトをクラスに追加することで、通知をキューに入れることができます。これらのインターフェースとトレイトは、make:notification
コマンドを使用して生成されたすべての通知に対して既にインポートされているため、通知クラスにすぐに追加できます:
<?php
namespace App\Notifications;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Notification;
class InvoicePaid extends Notification implements ShouldQueue
{
use Queueable;
// ...
}
ShouldQueue
インターフェースが通知に追加されたら、通常通り通知を送信できます。Laravel はクラスの ShouldQueue
インターフェースを検出し、通知の配信を自動的にキューに入れます。
$user->notify(new InvoicePaid($invoice));
通知をキューに入れる場合、各受信者とチャネルの組み合わせごとにキューにジョブが作成されます。たとえば、通知に 3 つの受信者と 2 つのチャネルがある場合、6 つのジョブがキューにディスパッチされます。
通知の遅延
通知の配信を遅らせたい場合は、通知のインスタンス化に delay
メソッドをチェーンすることができます。
$delay = now()->addMinutes(10);
$user->notify((new InvoicePaid($invoice))->delay($delay));
delay
メソッドに配列を渡して特定のチャネルの遅延量を指定することもできます。
$user->notify((new InvoicePaid($invoice))->delay([
'mail' => now()->addMinutes(5),
'sms' => now()->addMinutes(10),
]));
また、通知クラス自体に withDelay
メソッドを定義することもできます。withDelay
メソッドは、チャネル名と遅延値の配列を返す必要があります。
/**
* Determine the notification's delivery delay.
*
* @return array<string, \Illuminate\Support\Carbon>
*/
public function withDelay(object $notifiable): array
{
return [
'mail' => now()->addMinutes(5),
'sms' => now()->addMinutes(10),
];
}