- はじめに
- 通知の生成
- 通知の送信
- メール通知
- Markdownメール通知
- データベース通知
- ブロードキャスト通知
- SMS通知
- Slack通知
- 通知のローカライズ
- テスト
- 通知イベント
- カスタムチャネル
#はじめに
Laravelはメール送信のサポートに加え、メール、SMS(旧NexmoのVonage経由)、およびSlackなど、さまざまな配信チャネルで通知を送信する機能を提供します。さらに、多数の異なるチャネルで通知を送信できるコミュニティ製の通知チャネルも多数作成されています。通知はデータベースに保存して、ウェブインターフェースで表示することも可能です。
通常、通知はアプリケーション内で発生した事象をユーザーに知らせる短い情報メッセージであるべきです。例えば、請求アプリケーションを作成している場合、ユーザーに「請求書支払い済み」の通知をメールやSMSチャネルで送信することが考えられます。
#通知の生成
Laravelでは、各通知は通常 app/Notifications ディレクトリに保存される単一のクラスで表現されます。このディレクトリがアプリケーションに存在しなくても心配いりません。make:notification Artisanコマンドを実行すると自動的に作成されます。
php artisan make:notification InvoicePaid
このコマンドは新しい通知クラスを app/Notifications ディレクトリに配置します。各通知クラスには via メソッドと、toMail や toDatabase のような、特定のチャネル向けに通知をメッセージに変換する複数のメッセージ生成メソッドが含まれています。
#通知の送信
#Notifiableトレイトの使用
通知は、Notifiable トレイトの notify メソッドを使う方法と、Notification ファサードを使う方法の2通りで送信できます。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ファサードの使用
また、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サイトを参照してください。
via メソッドは $notifiable インスタンスを受け取ります。これは通知を受け取るクラスのインスタンスです。$notifiable を使って通知を配信するチャネルを決められます。
/**
* 通知の配信チャネルを取得します。
*
* @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 メソッドは、チャンネル名と遅延時間の配列を返す必要があります:
/**
* 通知の配信遅延を決定します。
*
* @return array<string, \Illuminate\Support\Carbon>
*/
public function withDelay(object $notifiable): array
{
return [
'mail' => now()->addMinutes(5),
'sms' => now()->addMinutes(10),
];
}
#通知キュー接続のカスタマイズ
デフォルトでは、キューに入れた通知はアプリケーションのデフォルトキュー接続を使います。特定の通知で別の接続を使いたい場合は、通知のコンストラクタ内で onConnection メソッドを呼び出せます。
<?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;
/**
* 新しい通知インスタンスを作成します。
*/
public function __construct()
{
$this->onConnection('redis');
}
}
または、通知がサポートする各チャネルごとに使うキュー接続を指定したい場合は、通知クラスに viaConnections メソッドを定義できます。このメソッドはチャネル名とキュー接続名のペアの配列を返します。
/**
* 各通知チャネルで使用する接続を決定します。
*
* @return array<string, string>
*/
public function viaConnections(): array
{
return [
'mail' => 'redis',
'database' => 'sync',
];
}
#通知チャネルごとのキューのカスタマイズ
通知がサポートする各チャネルごとに使うキューを指定したい場合は、通知クラスに viaQueues メソッドを定義できます。このメソッドはチャネル名とキュー名のペアの配列を返します。
/**
* 各通知チャネルで使用するキューを決定します。
*
* @return array<string, string>
*/
public function viaQueues(): array
{
return [
'mail' => 'mail-queue',
'slack' => 'slack-queue',
];
}
#キュー通知とデータベーストランザクション
キューに入れた通知がデータベーストランザクション内でディスパッチされる場合、トランザクションがコミットされる前にキューで処理されることがあります。この場合、トランザクション内で行ったモデルやデータベースレコードの更新がまだ反映されていない可能性があります。また、トランザクション内で作成したモデルやレコードがデータベースに存在しないこともあります。通知がこれらのモデルに依存している場合、キューで通知を送信するジョブの処理時に予期しないエラーが発生することがあります。
キュー接続の after_commit 設定オプションが false に設定されている場合でも、通知送信時に afterCommit メソッドを呼び出すことで、特定のキューイングされた通知をすべての未完了のデータベーストランザクションがコミットされた後に送信するよう指定できます。
use App\Notifications\InvoicePaid;
$user->notify((new InvoicePaid($invoice))->afterCommit());
あるいは、通知のコンストラクタ内で afterCommit メソッドを呼び出すこともできます。
<?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;
/**
* 新しい通知インスタンスを作成します。
*/
public function __construct()
{
$this->afterCommit();
}
}
これらの問題を回避する方法については、キュージョブとデータベーストランザクション のドキュメントを参照してください。
#キューイングされた通知を送信するかどうかの判定
キューイングされた通知は、バックグラウンド処理のためにキューに送信された後、通常はキューワーカーによって受け入れられ、対象の受信者に送信されます。
しかし、キューワーカーが処理中に通知を送信するか最終的に判断したい場合は、通知クラスに shouldSend メソッドを定義できます。このメソッドが false を返すと、通知は送信されません。
/**
* 通知を送信すべきか判定します。
*/
public function shouldSend(object $notifiable, string $channel): bool
{
return $this->invoice->isPaid();
}
#オンデマンド通知
アプリケーションの「ユーザー」として保存されていない相手に通知を送る必要がある場合があります。Notification ファサードの route メソッドを使うと、通知送信前にアドホックな通知ルーティング情報を指定できます。
use Illuminate\Broadcasting\Channel;
use Illuminate\Support\Facades\Notification;
Notification::route('mail', '[email protected]')
->route('vonage', '5555555555')
->route('slack', '#slack-channel')
->route('broadcast', [new Channel('channel-name')])
->notify(new InvoicePaid($invoice));
オンデマンド通知を mail ルートに送る際に受信者の名前を指定したい場合は、配列の最初の要素にメールアドレスをキー、名前を値として渡せます。
Notification::route('mail', [
'[email protected]' => 'Barrett Blair',
])->notify(new InvoicePaid($invoice));
routes メソッドを使うと、複数の通知チャネルに対してアドホックなルーティング情報を一度に指定できます。
Notification::routes([
'mail' => ['[email protected]' => 'Barrett Blair'],
'vonage' => '5555555555',
])->notify(new InvoicePaid($invoice));
#メール通知
#メールメッセージのフォーマット
通知がメール送信をサポートしている場合、通知クラスに toMail メソッドを定義します。このメソッドは $notifiable エンティティを受け取り、Illuminate\Notifications\Messages\MailMessage インスタンスを返す必要があります。
MailMessage クラスはトランザクションメールの構築を助けるシンプルなメソッドをいくつか提供します。メールメッセージはテキストの行や「コールトゥアクション」を含められます。以下は toMail メソッドの例です。
/**
* 通知のメール表現を取得します。
*/
public function toMail(object $notifiable): MailMessage
{
$url = url('/invoice/'.$this->invoice->id);
return (new MailMessage)
->greeting('Hello!')
->line('One of your invoices has been paid!')
->lineIf($this->amount > 0, "Amount paid: {$this->amount}")
->action('View Invoice', $url)
->line('Thank you for using our application!');
}
toMail メソッド内で $this->invoice->id を使用しています。通知のメッセージ生成に必要なデータは通知のコンストラクタに渡せます。
この例では、挨拶文、テキスト行、コールトゥアクション、さらにテキスト行を登録しています。MailMessage オブジェクトのメソッドで小規模なトランザクションメールを簡単かつ迅速にフォーマットできます。メールチャネルはこれらのメッセージ要素を美しくレスポンシブなHTMLメールテンプレートとプレーンテキストの両方に変換します。以下は mail チャネルで生成されるメールの例です。
メール通知を送信する際は、config/app.php の name 設定オプションを必ず設定してください。この値はメール通知のヘッダーとフッターに使用されます。
#エラーメッセージ
請求書の支払い失敗など、エラーをユーザーに通知する場合は、メッセージ構築時に error メソッドを呼び出してエラーであることを示せます。error メソッドを使うと、コールトゥアクションボタンが黒ではなく赤になります。
/**
* 通知のメール表現を取得します。
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->error()
->subject('Invoice Payment Failed')
->line('...');
}
#その他のメール通知フォーマットオプション
通知クラス内でテキストの「行」を定義する代わりに、view メソッドを使って通知メールのレンダリングに使うカスタムテンプレートを指定できます。
/**
* 通知のメール表現を取得します。
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)->view(
'mail.invoice.paid', ['invoice' => $this->invoice]
);
}
メールメッセージのプレーンテキストビューを指定するには、view メソッドに配列でビュー名を第二引数として渡します。
/**
* 通知のメール表現を取得します。
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)->view(
['mail.invoice.paid', 'mail.invoice.paid-text'],
['invoice' => $this->invoice]
);
}
メッセージがプレーンテキストビューのみの場合は、text メソッドを利用できます。
/**
* 通知のメール表現を取得します。
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)->text(
'mail.invoice.paid-text', ['invoice' => $this->invoice]
);
}
#送信者のカスタマイズ
デフォルトでは、メールの送信元アドレスは config/mail.php の設定ファイルで定義されています。ただし、特定の通知に対しては from メソッドで送信元を指定できます。
/**
* 通知のメール表現を取得します。
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->from('[email protected]', 'Barrett Blair')
->line('...');
}
#受信者のカスタマイズ
mail チャネルで通知を送信する際、通知システムは自動的に通知対象エンティティの email プロパティを探します。通知対象エンティティに routeNotificationForMail メソッドを定義すると、使用するメールアドレスをカスタマイズできます。
<?php
namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Notifications\Notification;
class User extends Authenticatable
{
use Notifiable;
/**
* mail チャネル用の通知ルートを返します。
*
* @return array<string, string>|string
*/
public function routeNotificationForMail(Notification $notification): array|string
{
// メールアドレスのみを返す場合...
return $this->email_address;
// メールアドレスと名前を返す場合...
return [$this->email_address => $this->name];
}
}
#件名のカスタマイズ
デフォルトでは、メールの件名は通知クラス名を「タイトルケース」に変換したものになります。例えば通知クラスが InvoicePaid なら、件名は Invoice Paid です。異なる件名を指定したい場合は、メッセージ構築時に subject メソッドを呼び出します。
/**
* 通知のメール表現を取得します。
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->subject('Notification Subject')
->line('...');
}
#メーラーのカスタマイズ
デフォルトでは、メール通知は config/mail.php で定義されたデフォルトのメーラーを使って送信されます。ただし、メッセージ構築時に mailer メソッドを呼び出すことで、実行時に別のメーラーを指定できます。
/**
* 通知のメール表現を取得します。
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->mailer('postmark')
->line('...');
}
#テンプレートのカスタマイズ
通知パッケージのリソースを公開すると、メール通知で使われるHTMLおよびプレーンテキストのテンプレートを変更できます。このコマンドを実行すると、メール通知テンプレートは resources/views/vendor/notifications ディレクトリに配置されます。
php artisan vendor:publish --tag=laravel-notifications
#添付ファイル
メール通知に添付ファイルを追加するには、メッセージ構築時に attach メソッドを使います。attach メソッドはファイルの絶対パスを第一引数に受け取ります。
/**
* 通知のメール表現を取得します。
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->greeting('Hello!')
->attach('/path/to/file');
}
通知メールメッセージの attach メソッドは 添付可能オブジェクト も受け付けます。詳細は 添付可能オブジェクトのドキュメント をご覧ください。
メッセージにファイルを添付する際、attachメソッドの第2引数にarrayを渡すことで、表示名やMIMEタイプ(またはその両方)を指定できます:
/**
* 通知のメール表現を取得します。
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->greeting('Hello!')
->attach('/path/to/file', [
'as' => 'name.pdf',
'mime' => 'application/pdf',
]);
}
mailable オブジェクトでのファイル添付とは異なり、attachFromStorage を使ってストレージディスクから直接ファイルを添付できません。代わりにストレージディスク上のファイルの絶対パスを使って attach メソッドを使うか、toMail メソッドから mailable を返してください。
use App\Mail\InvoicePaid as InvoicePaidMailable;
/**
* 通知のメール表現を取得します。
*/
public function toMail(object $notifiable): Mailable
{
return (new InvoicePaidMailable($this->invoice))
->to($notifiable->email)
->attachFromStorage('/path/to/file');
}
必要に応じて、複数のファイルを attachMany メソッドで添付できます。
/**
* 通知のメール表現を取得します。
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->greeting('Hello!')
->attachMany([
'/path/to/forge.svg',
'/path/to/vapor.svg' => [
'as' => 'Logo.svg',
'mime' => 'image/svg+xml',
],
]);
}
#生データの添付ファイル
attachData メソッドは、生のバイト列を添付ファイルとして追加する際に使用します。attachData を呼び出す際は、添付ファイルに割り当てるファイル名を指定してください。
/**
* 通知のメール表現を取得します。
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->greeting('Hello!')
->attachData($this->pdf, 'name.pdf', [
'mime' => 'application/pdf',
]);
}
#タグとメタデータの追加
Mailgun や Postmark などの一部のサードパーティメールプロバイダーは、メッセージの「タグ」や「メタデータ」をサポートしており、これらを使ってアプリケーションから送信したメールをグループ化・追跡できます。tag と metadata メソッドを使ってメールメッセージにタグやメタデータを追加できます。
/**
* 通知のメール表現を取得します。
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->greeting('Comment Upvoted!')
->tag('upvote')
->metadata('comment_id', $this->comment->id);
}
アプリケーションで Mailgun ドライバーを使用している場合は、タグやメタデータに関する詳細は Mailgun のドキュメントを参照してください。同様に、Postmark のタグとメタデータのサポートについては、それぞれのタグとメタデータのドキュメントを参照できます。
アプリケーションで Amazon SES を使ってメールを送信している場合は、metadata メソッドを使ってメッセージに SES の「タグ」 を添付してください。
#Symfony メッセージのカスタマイズ
MailMessage クラスの withSymfonyMessage メソッドは、メッセージ送信前に Symfony の Message インスタンスを受け取るクロージャを登録できます。これにより、メッセージが配信される前に詳細なカスタマイズが可能です。
use Symfony\Component\Mime\Email;
/**
* 通知のメール表現を取得します。
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->withSymfonyMessage(function (Email $message) {
$message->getHeaders()->addTextHeader(
'Custom-Header', 'Header Value'
);
});
}
#Mailables の利用
必要に応じて、通知の toMail メソッドから完全な mailable オブジェクト を返すことができます。MailMessage の代わりに Mailable を返す場合は、mailable オブジェクトの to メソッドで受信者を指定する必要があります。
use App\Mail\InvoicePaid as InvoicePaidMailable;
use Illuminate\Mail\Mailable;
/**
* 通知のメール表現を取得します。
*/
public function toMail(object $notifiable): Mailable
{
return (new InvoicePaidMailable($this->invoice))
->to($notifiable->email);
}
#Mailables とオンデマンド通知
オンデマンド通知 を送信する場合、toMail メソッドに渡される $notifiable インスタンスは Illuminate\Notifications\AnonymousNotifiable のインスタンスであり、送信先メールアドレスを取得するための routeNotificationFor メソッドを提供します。
use App\Mail\InvoicePaid as InvoicePaidMailable;
use Illuminate\Notifications\AnonymousNotifiable;
use Illuminate\Mail\Mailable;
/**
* 通知のメール表現を取得します。
*/
public function toMail(object $notifiable): Mailable
{
$address = $notifiable instanceof AnonymousNotifiable
? $notifiable->routeNotificationFor('mail')
: $notifiable->email;
return (new InvoicePaidMailable($this->invoice))
->to($address);
}
#メール通知のプレビュー
メール通知テンプレートを設計する際、通常の Blade テンプレートのようにブラウザでレンダリング結果をすぐにプレビューできると便利です。そのため、Laravel では通知から生成されたメールメッセージをルートクロージャやコントローラーから直接返すことができます。MailMessage を返すとブラウザでレンダリングされ、実際にメールを送信せずにデザインを確認できます。
use App\Models\Invoice;
use App\Notifications\InvoicePaid;
Route::get('/notification', function () {
$invoice = Invoice::find(1);
return (new InvoicePaid($invoice))
->toMail($invoice->user);
});
#Markdown メール通知
Markdown メール通知は、メール通知の既成テンプレートを活用しつつ、より自由に長いカスタムメッセージを書けるようにします。メッセージは Markdown で記述されるため、Laravel は美しくレスポンシブな HTML テンプレートをレンダリングし、同時にプレーンテキスト版も自動生成します。
#メッセージの生成
対応する Markdown テンプレート付きの通知を生成するには、make:notification Artisan コマンドの --markdown オプションを使います。
php artisan make:notification InvoicePaid --markdown=mail.invoice.paid
他のメール通知と同様に、Markdown テンプレートを使う通知は通知クラスに toMail メソッドを定義します。ただし、line や action メソッドで通知を構築する代わりに、markdown メソッドで使用する Markdown テンプレート名を指定します。テンプレートに渡すデータは第二引数の配列で指定できます。
/**
* 通知のメール表現を取得します。
*/
public function toMail(object $notifiable): MailMessage
{
$url = url('/invoice/'.$this->invoice->id);
return (new MailMessage)
->subject('Invoice Paid')
->markdown('mail.invoice.paid', ['url' => $url]);
}
#メッセージの記述
Markdown メール通知は、Blade コンポーネントと Markdown 構文を組み合わせて使い、Laravel の既成通知コンポーネントを活用しながら簡単に通知を構築できます。
<x-mail::message>
# Invoice Paid
Your invoice has been paid!
<x-mail::button :url="$url">
View Invoice
</x-mail::button>
Thanks,<br>
{{ config('app.name') }}
</x-mail::message>
#ボタンコンポーネント
ボタンコンポーネントは中央揃えのボタンリンクをレンダリングします。url とオプションの color の2つの引数を受け付けます。サポートされている色は primary、green、red です。通知に複数のボタンコンポーネントを追加できます。
<x-mail::button :url="$url" color="green">
View Invoice
</x-mail::button>
#パネルコンポーネント
パネルコンポーネントは、通知の他の部分とは異なる背景色のパネル内にテキストブロックを表示します。これにより、特定のテキストに注目を集められます。
<x-mail::panel>
This is the panel content.
</x-mail::panel>
#テーブルコンポーネント
テーブルコンポーネントは Markdown のテーブルを HTML テーブルに変換します。Markdown テーブルをコンテンツとして受け取り、Markdown のテーブル列の配置指定もサポートします。
<x-mail::table>
| Laravel | Table | Example |
| ------------- |:-------------:| --------:|
| Col 2 is | Centered | $10 |
| Col 3 is | Right-Aligned | $20 |
</x-mail::table>
#コンポーネントのカスタマイズ
Markdown 通知コンポーネントはすべてアプリケーションにエクスポートしてカスタマイズできます。コンポーネントをエクスポートするには、vendor:publish Artisan コマンドで laravel-mail アセットタグを公開してください。
php artisan vendor:publish --tag=laravel-mail
このコマンドにより、Markdown メールコンポーネントが resources/views/vendor/mail ディレクトリに公開されます。mail ディレクトリには html と text のディレクトリがあり、それぞれのコンポーネントの表現が含まれています。自由にカスタマイズ可能です。
#CSS のカスタマイズ
コンポーネントをエクスポートすると、resources/views/vendor/mail/html/themes ディレクトリに default.css ファイルが生成されます。このファイルの CSS をカスタマイズすると、Markdown 通知の HTML 表現に自動的にインラインスタイルとして適用されます。
Laravel の Markdown コンポーネント用にまったく新しいテーマを作成したい場合は、html/themes ディレクトリに CSS ファイルを配置してください。ファイル名を付けて保存したら、mail 設定ファイルの theme オプションを新しいテーマ名に更新します。
個別の通知でテーマをカスタマイズしたい場合は、通知のメールメッセージを構築する際に theme メソッドを呼び出します。theme メソッドには送信時に使うテーマ名を指定します。
/**
* 通知のメール表現を取得します。
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->theme('invoice')
->subject('Invoice Paid')
->markdown('mail.invoice.paid', ['url' => $url]);
}
#データベース通知
#前提条件
database 通知チャネルは通知情報をデータベースのテーブルに保存します。このテーブルには通知タイプや通知を表す JSON データ構造などが含まれます。
通知をアプリケーションのユーザーインターフェイスに表示するには、このテーブルをクエリできます。ただし、その前に通知を保存するためのデータベーステーブルを作成する必要があります。notifications:table コマンドを使うと、適切なテーブルスキーマを持つマイグレーションを生成できます。
php artisan notifications:table
php artisan migrate
通知対象のモデルが UUID または ULID の主キー を使っている場合は、通知テーブルのマイグレーションで morphs メソッドを uuidMorphs または ulidMorphs に置き換えてください。
#データベース通知のフォーマット
通知がデータベースに保存可能な場合、通知クラスに toDatabase または toArray メソッドを定義してください。このメソッドは $notifiable エンティティを受け取り、プレーンな PHP 配列を返します。返された配列は JSON にエンコードされ、notifications テーブルの data カラムに保存されます。以下は toArray メソッドの例です。
/**
* 通知の配列表現を取得します。
*
* @return array<string, mixed>
*/
public function toArray(object $notifiable): array
{
return [
'invoice_id' => $this->invoice->id,
'amount' => $this->invoice->amount,
];
}
通知がアプリケーションのデータベースに保存される際、type カラムには通知クラス名が格納されます。ただし、通知クラスに databaseType メソッドを定義すると、この動作をカスタマイズできます。
/**
* 通知のデータベースタイプを取得します。
*
* @return string
*/
public function databaseType(object $notifiable): string
{
return 'invoice-paid';
}
#toDatabase と toArray の違い
toArray メソッドは、broadcast チャンネルが JavaScript ベースのフロントエンドにどのデータを送信するかを決定する際にも使用されます。database チャンネルと broadcast チャンネルで異なる配列表現を持ちたい場合は、toArray メソッドの代わりに toDatabase メソッドを定義してください。
#通知へのアクセス
通知がデータベースに保存されたら、通知可能なエンティティから簡単にアクセスできる方法が必要です。Laravel のデフォルトの App\Models\User モデルに含まれる Illuminate\Notifications\Notifiable トレイトには、エンティティの通知を返す notifications の Eloquent リレーションシップ が含まれています。通知を取得するには、このメソッドを他の Eloquent リレーションシップと同様にアクセスできます。デフォルトでは、通知は created_at タイムスタンプでソートされ、最新の通知がコレクションの先頭に来ます。
$user = App\Models\User::find(1);
foreach ($user->notifications as $notification) {
echo $notification->type;
}
未読の通知のみを取得したい場合は、unreadNotifications リレーションシップを使用できます。こちらも created_at タイムスタンプでソートされ、最新の通知がコレクションの先頭に来ます。
$user = App\Models\User::find(1);
foreach ($user->unreadNotifications as $notification) {
echo $notification->type;
}
JavaScript クライアントから通知にアクセスするには、現在のユーザーなどの通知可能なエンティティの通知を返す通知コントローラーをアプリケーションに定義してください。そのコントローラーの URL に対して JavaScript クライアントから HTTP リクエストを送信できます。
#通知を既読にする
通常、ユーザーが通知を閲覧した際に「既読」とマークしたいでしょう。Illuminate\Notifications\Notifiable トレイトは markAsRead メソッドを提供しており、通知のデータベースレコードの read_at カラムを更新します。
$user = App\Models\User::find(1);
foreach ($user->unreadNotifications as $notification) {
$notification->markAsRead();
}
ただし、各通知をループ処理する代わりに、通知コレクションに対して直接 markAsRead メソッドを使うこともできます。
$user->unreadNotifications->markAsRead();
また、通知をデータベースから取得せずに一括更新クエリで全て既読にすることも可能です。
$user = App\Models\User::find(1);
$user->unreadNotifications()->update(['read_at' => now()]);
通知を完全にテーブルから削除したい場合は、delete メソッドを使えます。
$user->notifications()->delete();
#ブロードキャスト通知
#前提条件
通知をブロードキャストする前に、Laravel の イベントブロードキャスト サービスの設定と理解が必要です。イベントブロードキャストは、JavaScript ベースのフロントエンドでサーバーサイドの Laravel イベントにリアルタイムで反応する方法を提供します。
#ブロードキャスト通知のフォーマット
broadcast チャンネルは Laravel の イベントブロードキャスト サービスを使って通知を送信し、JavaScript ベースのフロントエンドでリアルタイムに通知を受け取れます。通知がブロードキャストをサポートする場合、通知クラスに toBroadcast メソッドを定義できます。このメソッドは $notifiable エンティティを受け取り、BroadcastMessage インスタンスを返す必要があります。toBroadcast メソッドが存在しない場合は、toArray メソッドがブロードキャストすべきデータを取得するために使われます。返されたデータは JSON にエンコードされ、JavaScript ベースのフロントエンドに送信されます。以下は toBroadcast メソッドの例です。
use Illuminate\Notifications\Messages\BroadcastMessage;
/**
* 通知のブロードキャスト可能な表現を取得します。
*/
public function toBroadcast(object $notifiable): BroadcastMessage
{
return new BroadcastMessage([
'invoice_id' => $this->invoice->id,
'amount' => $this->invoice->amount,
]);
}
#ブロードキャストキューの設定
すべてのブロードキャスト通知はキューに入れられます。ブロードキャスト処理に使用するキュー接続やキュー名を設定したい場合は、BroadcastMessage の onConnection と onQueue メソッドを使えます。
return (new BroadcastMessage($data))
->onConnection('sqs')
->onQueue('broadcasts');
#通知タイプのカスタマイズ
指定したデータに加え、すべてのブロードキャスト通知には通知クラスの完全修飾クラス名を含む type フィールドがあります。通知の type をカスタマイズしたい場合は、通知クラスに broadcastType メソッドを定義できます。
/**
* ブロードキャストされる通知のタイプを取得します。
*/
public function broadcastType(): string
{
return 'broadcast.message';
}
#通知のリスニング
通知は {notifiable}.{id} 形式のプライベートチャンネルでブロードキャストされます。例えば、ID が 1 の App\Models\User インスタンスに通知を送る場合、App.Models.User.1 プライベートチャンネルで通知がブロードキャストされます。Laravel Echo を使うと、notification メソッドで簡単に通知をリッスンできます。
Echo.private('App.Models.User.' + userId)
.notification((notification) => {
console.log(notification.type);
});
#通知チャンネルのカスタマイズ
エンティティのブロードキャスト通知が送信されるチャンネルをカスタマイズしたい場合は、通知可能なエンティティに receivesBroadcastNotificationsOn メソッドを定義できます。
<?php
namespace App\Models;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable
{
use Notifiable;
/**
* ユーザーが通知ブロードキャストを受け取るチャンネル。
*/
public function receivesBroadcastNotificationsOn(): string
{
return 'users.'.$this->id;
}
}
#SMS 通知
#前提条件
Laravel での SMS 通知は Vonage(旧 Nexmo)によって提供されます。Vonage 経由で通知を送信するには、laravel/vonage-notification-channel と guzzlehttp/guzzle パッケージをインストールする必要があります。
composer require laravel/vonage-notification-channel guzzlehttp/guzzle
このパッケージには 設定ファイル が含まれていますが、アプリケーションにエクスポートする必要はありません。VONAGE_KEY と VONAGE_SECRET の環境変数で Vonage の公開キーと秘密キーを設定できます。
キーを設定した後、SMS メッセージの送信元電話番号を定義する VONAGE_SMS_FROM 環境変数を設定してください。この電話番号は Vonage コントロールパネルで生成できます。
VONAGE_SMS_FROM=15556666666
#SMS 通知のフォーマット
通知が SMS 送信をサポートする場合、通知クラスに toVonage メソッドを定義してください。このメソッドは $notifiable エンティティを受け取り、Illuminate\Notifications\Messages\VonageMessage インスタンスを返す必要があります。
use Illuminate\Notifications\Messages\VonageMessage;
/**
* 通知の Vonage / SMS 表現を取得します。
*/
public function toVonage(object $notifiable): VonageMessage
{
return (new VonageMessage)
->content('Your SMS message content');
}
#Unicode コンテンツ
SMS メッセージにユニコード文字が含まれる場合は、VonageMessage インスタンスを作成する際に unicode メソッドを呼び出してください。
use Illuminate\Notifications\Messages\VonageMessage;
/**
* 通知の Vonage / SMS 表現を取得します。
*/
public function toVonage(object $notifiable): VonageMessage
{
return (new VonageMessage)
->content('Your unicode message')
->unicode();
}
#送信元番号のカスタマイズ
VONAGE_SMS_FROM 環境変数で指定した電話番号とは異なる番号から通知を送りたい場合は、VonageMessage インスタンスの from メソッドを呼び出してください。
use Illuminate\Notifications\Messages\VonageMessage;
/**
* 通知の Vonage / SMS 表現を取得します。
*/
public function toVonage(object $notifiable): VonageMessage
{
return (new VonageMessage)
->content('Your SMS message content')
->from('15554443333');
}
#クライアントリファレンスの追加
ユーザーやチーム、クライアントごとのコストを追跡したい場合は、通知に「クライアントリファレンス」を追加できます。Vonage はこのクライアントリファレンスを使ってレポートを生成でき、特定の顧客の SMS 利用状況を把握しやすくなります。クライアントリファレンスは最大40文字の任意の文字列です。
use Illuminate\Notifications\Messages\VonageMessage;
/**
* 通知の Vonage / SMS 表現を取得します。
*/
public function toVonage(object $notifiable): VonageMessage
{
return (new VonageMessage)
->clientReference((string) $notifiable->id)
->content('Your SMS message content');
}
#SMS 通知のルーティング
Vonage 通知を適切な電話番号にルーティングするには、通知可能なエンティティに routeNotificationForVonage メソッドを定義してください。
<?php
namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Notifications\Notification;
class User extends Authenticatable
{
use Notifiable;
/**
* Vonage チャンネルの通知ルーティング。
*/
public function routeNotificationForVonage(Notification $notification): string
{
return $this->phone_number;
}
}
#Slack 通知
#前提条件
Slack 通知を送信する前に、Composer で Slack 通知チャンネルをインストールしてください。
composer require laravel/slack-notification-channel
さらに、Slack ワークスペース用に Slack App を作成する必要があります。
通知を App が作成された同じ Slack ワークスペースにのみ送信する場合は、App に chat:write、chat:write.public、chat:write.customize スコープがあることを確認してください。これらのスコープは Slack の「OAuth & Permissions」App 管理タブから追加できます。
次に、App の「Bot User OAuth Token」をコピーし、アプリケーションの services.php 設定ファイルの slack 設定配列に配置してください。このトークンは Slack の「OAuth & Permissions」タブで確認できます。
'slack' => [
'notifications' => [
'bot_user_oauth_token' => env('SLACK_BOT_USER_OAUTH_TOKEN'),
'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'),
],
],
#App 配布
アプリケーションが、そのユーザーが所有する外部のSlackワークスペースに通知を送信する場合、Slack経由でアプリを「配布」する必要があります。アプリの配布はSlack内のアプリの「Manage Distribution」タブから管理できます。アプリが配布されたら、Socialiteを使ってアプリケーションのユーザーに代わりにSlackのBotトークンを取得することができます。
#Slack 通知のフォーマット
通知がSlackメッセージとして送信可能な場合、通知クラスに toSlack メソッドを定義する必要があります。このメソッドは $notifiable エンティティを受け取り、Illuminate\Notifications\Slack\SlackMessage インスタンスを返すべきです。リッチな通知はSlackのBlock Kit APIを使って構築できます。以下の例はSlackのBlock Kitビルダーでプレビューできます:
use Illuminate\Notifications\Slack\BlockKit\Blocks\ContextBlock;
use Illuminate\Notifications\Slack\BlockKit\Blocks\SectionBlock;
use Illuminate\Notifications\Slack\BlockKit\Composites\ConfirmObject;
use Illuminate\Notifications\Slack\SlackMessage;
/**
* 通知のSlack表現を取得します。
*/
public function toSlack(object $notifiable): SlackMessage
{
return (new SlackMessage)
->text('あなたの請求書の一つが支払われました!')
->headerBlock('Invoice Paid')
->contextBlock(function (ContextBlock $block) {
$block->text('Customer #1234');
})
->sectionBlock(function (SectionBlock $block) {
$block->text('請求書が支払われました。');
$block->field("*Invoice No:*\n1000")->markdown();
$block->field("*Invoice Recipient:*\[email protected]")->markdown();
})
->dividerBlock()
->sectionBlock(function (SectionBlock $block) {
$block->text('おめでとうございます!');
});
}
#Slackのインタラクティビティ
SlackのBlock Kit通知システムは、ユーザー操作の処理に強力な機能を提供します。これらの機能を利用するには、Slackアプリで「Interactivity」を有効にし、アプリケーションが提供するURLを指す「Request URL」を設定する必要があります。これらの設定はSlackの「Interactivity & Shortcuts」アプリ管理タブから行えます。
以下の例では actionsBlock メソッドを使っています。Slackはボタンがクリックされると「Request URL」へ POST リクエストを送信し、クリックしたSlackユーザーやボタンIDなどのペイロードを含みます。アプリケーションはこのペイロードを元に処理を判断できます。また、リクエストがSlackからのものであることを検証する必要があります:
use Illuminate\Notifications\Slack\BlockKit\Blocks\ActionsBlock;
use Illuminate\Notifications\Slack\BlockKit\Blocks\ContextBlock;
use Illuminate\Notifications\Slack\BlockKit\Blocks\SectionBlock;
use Illuminate\Notifications\Slack\SlackMessage;
/**
* 通知のSlack表現を取得します。
*/
public function toSlack(object $notifiable): SlackMessage
{
return (new SlackMessage)
->text('あなたの請求書の一つが支払われました!')
->headerBlock('Invoice Paid')
->contextBlock(function (ContextBlock $block) {
$block->text('Customer #1234');
})
->sectionBlock(function (SectionBlock $block) {
$block->text('請求書が支払われました。');
})
->actionsBlock(function (ActionsBlock $block) {
// IDはデフォルトで "button_acknowledge_invoice" になります...
$block->button('請求書を承認')->primary();
// IDを手動で設定...
$block->button('拒否')->danger()->id('deny_invoice');
});
}
#確認モーダル
ユーザーに操作の実行前に確認を求めたい場合、ボタン定義時に confirm メソッドを呼び出せます。confirm メソッドはメッセージと ConfirmObject インスタンスを受け取るクロージャを引数に取ります:
use Illuminate\Notifications\Slack\BlockKit\Blocks\ActionsBlock;
use Illuminate\Notifications\Slack\BlockKit\Blocks\ContextBlock;
use Illuminate\Notifications\Slack\BlockKit\Blocks\SectionBlock;
use Illuminate\Notifications\Slack\BlockKit\Composites\ConfirmObject;
use Illuminate\Notifications\Slack\SlackMessage;
/**
* 通知のSlack表現を取得します。
*/
public function toSlack(object $notifiable): SlackMessage
{
return (new SlackMessage)
->text('あなたの請求書の一つが支払われました!')
->headerBlock('Invoice Paid')
->contextBlock(function (ContextBlock $block) {
$block->text('Customer #1234');
})
->sectionBlock(function (SectionBlock $block) {
$block->text('請求書が支払われました。');
})
->actionsBlock(function (ActionsBlock $block) {
$block->button('請求書を承認')
->primary()
->confirm(
'支払いを承認し、感謝のメールを送信しますか?',
function (ConfirmObject $dialog) {
$dialog->confirm('はい');
$dialog->deny('いいえ');
}
);
});
}
#Slackブロックの確認
作成中のブロックを素早く確認したい場合、SlackMessage インスタンスの dd メソッドを呼べます。dd メソッドはSlackのBlock Kit BuilderへのURLを生成してダンプし、ブラウザでペイロードと通知のプレビューを表示します。dd メソッドに true を渡すと生のペイロードをダンプします:
return (new SlackMessage)
->text('あなたの請求書の一つが支払われました!')
->headerBlock('Invoice Paid')
->dd();
#Slack通知のルーティング
Slack通知を適切なSlackチームやチャンネルに送るには、notifiableモデルに routeNotificationForSlack メソッドを定義します。このメソッドは以下のいずれかを返せます:
null- 通知自身で設定されたチャンネルへのルーティングを委ねます。通知内でSlackMessageのtoメソッドを使いチャンネルを指定できます。- 通知を送るSlackチャンネルを示す文字列(例:
#support-channel)。 - OAuthトークンとチャンネル名を指定できる
SlackRouteインスタンス(例:SlackRoute::make($this->slack_channel, $this->slack_token))。外部ワークスペースへの通知送信に使います。
例えば、routeNotificationForSlack メソッドで #support-channel を返すと、アプリケーションの services.php 設定ファイルにあるBotユーザーOAuthトークンに紐づくワークスペースの #support-channel チャンネルに通知が送られます:
<?php
namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Notifications\Notification;
class User extends Authenticatable
{
use Notifiable;
/**
* Slackチャンネルへの通知ルーティング。
*/
public function routeNotificationForSlack(Notification $notification): mixed
{
return '#support-channel';
}
}
#外部Slackワークスペースへの通知
外部Slackワークスペースに通知を送る前に、Slackアプリを配布している必要があります。
もちろん、アプリケーションのユーザーが所有するSlackワークスペースに通知を送りたいことが多いでしょう。そのためには、まずユーザーのSlack OAuthトークンを取得する必要があります。幸いにも、Laravel SocialiteにはSlackドライバーが含まれており、ユーザーのSlack認証とボットトークンの取得を簡単に行えます。
ボットトークンを取得してアプリケーションのデータベースに保存したら、SlackRoute::make メソッドを使ってユーザーのワークスペースに通知をルーティングできます。さらに、ユーザーが通知を送るチャンネルを指定できるようにする必要があるでしょう:
<?php
namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Notifications\Notification;
use Illuminate\Notifications\Slack\SlackRoute;
class User extends Authenticatable
{
use Notifiable;
/**
* Slackチャンネルへの通知ルーティング。
*/
public function routeNotificationForSlack(Notification $notification): mixed
{
return SlackRoute::make($this->slack_channel, $this->slack_token);
}
}
#通知のローカライズ
LaravelはHTTPリクエストの現在のロケールとは異なるロケールで通知を送信でき、通知がキューに入ってもこのロケールを記憶します。
これを実現するために、Illuminate\Notifications\Notification クラスは希望の言語を設定する locale メソッドを提供します。通知の評価時にこのロケールに切り替え、評価完了後に元のロケールに戻します:
$user->notify((new InvoicePaid($invoice))->locale('es'));
複数のnotifiableエントリのローカライズは Notification ファサードでも可能です:
Notification::locale('es')->send(
$users, new InvoicePaid($invoice)
);
#ユーザーの優先ロケール
アプリケーションによっては、ユーザーごとの優先ロケールを保存している場合があります。notifiableモデルに HasLocalePreference インターフェイスを実装すると、Laravelは通知送信時にこの保存されたロケールを使います:
use Illuminate\Contracts\Translation\HasLocalePreference;
class User extends Model implements HasLocalePreference
{
/**
* ユーザーの優先ロケールを取得します。
*/
public function preferredLocale(): string
{
return $this->locale;
}
}
インターフェイスを実装すると、Laravelは通知やメール送信時に自動的に優先ロケールを使うため、locale メソッドを呼ぶ必要はありません:
$user->notify(new InvoicePaid($invoice));
#テスト
Notification ファサードの fake メソッドを使うと通知の送信を防げます。通常、通知送信はテスト対象のコードとは無関係なので、Laravelが特定の通知を送るよう指示したことを検証するだけで十分です。
Notification ファサードの fake メソッドを呼んだ後、通知がユーザーに送られるよう指示されたかを検証し、通知が受け取ったデータを調べることもできます:
<?php
namespace Tests\Feature;
use App\Notifications\OrderShipped;
use Illuminate\Support\Facades\Notification;
use Tests\TestCase;
class ExampleTest extends TestCase
{
public function test_orders_can_be_shipped(): void
{
Notification::fake();
// 注文の発送処理を実行...
// 通知が送信されていないことをアサートします...
Notification::assertNothingSent();
// 指定したユーザーに通知が送信されたことをアサートします...
Notification::assertSentTo(
[$user], OrderShipped::class
);
// 通知が送信されていないことをアサートします...
Notification::assertNotSentTo(
[$user], AnotherNotification::class
);
// 指定した数の通知が送信されたことをアサートします...
Notification::assertCount(3);
}
}
assertSentTo または assertNotSentTo メソッドにクロージャを渡すことで、特定の「真偽テスト」を通過する通知が送信されたかどうかをアサートできます。少なくとも1つの通知がそのテストを通過すれば、アサーションは成功します。
Notification::assertSentTo(
$user,
function (OrderShipped $notification, array $channels) use ($order) {
return $notification->order->id === $order->id;
}
);
#オンデマンド通知
テスト対象のコードがオンデマンド通知を送信する場合、assertSentOnDemand メソッドでオンデマンド通知が送信されたことをテストできます。
Notification::assertSentOnDemand(OrderShipped::class);
assertSentOnDemand メソッドの第2引数にクロージャを渡すことで、オンデマンド通知が正しい「ルート」アドレスに送信されたかどうかを判定できます。
Notification::assertSentOnDemand(
OrderShipped::class,
function (OrderShipped $notification, array $channels, object $notifiable) use ($user) {
return $notifiable->routes['mail'] === $user->email;
}
);
#通知イベント
#通知送信中イベント
通知が送信される際、通知システムは Illuminate\Notifications\Events\NotificationSending イベント を発行します。このイベントには「notifiable」エンティティと通知インスタンスが含まれます。アプリケーションの EventServiceProvider でこのイベントのリスナーを登録できます。
use App\Listeners\CheckNotificationStatus;
use Illuminate\Notifications\Events\NotificationSending;
/**
* アプリケーションのイベントリスナーのマッピング。
*
* @var array
*/
protected $listen = [
NotificationSending::class => [
CheckNotificationStatus::class,
],
];
NotificationSending イベントのリスナーが handle メソッドで false を返すと、通知は送信されません。
use Illuminate\Notifications\Events\NotificationSending;
/**
* イベントを処理します。
*/
public function handle(NotificationSending $event): bool
{
return false;
}
イベントリスナー内では、notifiable、notification、channel プロパティにアクセスして、通知の受信者や通知自体の詳細を取得できます。
/**
* イベントを処理します。
*/
public function handle(NotificationSending $event): void
{
// $event->channel
// $event->notifiable
// $event->notification
}
#通知送信完了イベント
通知が送信されると、通知システムは Illuminate\Notifications\Events\NotificationSent イベント を発行します。このイベントには「notifiable」エンティティと通知インスタンスが含まれます。EventServiceProvider でこのイベントのリスナーを登録できます。
use App\Listeners\LogNotification;
use Illuminate\Notifications\Events\NotificationSent;
/**
* アプリケーションのイベントリスナーのマッピング。
*
* @var array
*/
protected $listen = [
NotificationSent::class => [
LogNotification::class,
],
];
EventServiceProvider にリスナーを登録した後、event:generate Artisan コマンドでリスナークラスを素早く生成できます。
イベントリスナー内では、notifiable、notification、channel、response プロパティにアクセスして、通知の受信者や通知自体の詳細を取得できます。
/**
* イベントを処理します。
*/
public function handle(NotificationSent $event): void
{
// $event->channel
// $event->notifiable
// $event->notification
// $event->response
}
#カスタムチャネル
Laravel はいくつかの通知チャネルを標準で提供しますが、他のチャネル経由で通知を配信するために独自のドライバーを作成することもできます。Laravel はこれを簡単にします。まず、send メソッドを持つクラスを定義してください。このメソッドは $notifiable と $notification の2つの引数を受け取ります。
send メソッド内で、通知からチャネルが理解できるメッセージオブジェクトを取得し、任意の方法で $notifiable に通知を送信できます。
<?php
namespace App\Notifications;
use Illuminate\Notifications\Notification;
class VoiceChannel
{
/**
* 指定された通知を送信します。
*/
public function send(object $notifiable, Notification $notification): void
{
$message = $notification->toVoice($notifiable);
// $notifiable インスタンスに通知を送信します...
}
}
通知チャネルクラスを定義したら、任意の通知の via メソッドでクラス名を返せます。この例では、通知の toVoice メソッドが音声メッセージを表す任意のオブジェクトを返せます。例えば、独自の VoiceMessage クラスを定義してこれらのメッセージを表現できます。
<?php
namespace App\Notifications;
use App\Notifications\Messages\VoiceMessage;
use App\Notifications\VoiceChannel;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Notification;
class InvoicePaid extends Notification
{
use Queueable;
/**
* 通知チャネルを取得します。
*/
public function via(object $notifiable): string
{
return VoiceChannel::class;
}
/**
* 通知の音声表現を取得します。
*/
public function toVoice(object $notifiable): VoiceMessage
{
// ...
}
}