メインコンテンツまでスキップ

通知

はじめに

Laravel は メールの送信 をサポートするだけでなく、メール、SMS(Vonage、以前は Nexmo として知られていました)、Slack を含むさまざまな配信チャンネルを介して通知を送信するためのサポートも提供しています。さらに、コミュニティによって作成されたさまざまな通知チャンネル が作成され、数十種類の異なるチャンネルを介して通知を送信することができます!通知はデータベースに保存されることもあり、Web インターフェースで表示することができます。

通常、通知はアプリケーションで発生したことをユーザーに通知するための短い情報メッセージであるべきです。たとえば、請求アプリケーションを作成している場合、メールおよびSMSチャンネルを介してユーザーに「請求書が支払われました」という通知を送信するかもしれません。

通知の生成

Laravel では、各通知は通常 app/Notifications ディレクトリに保存される単一のクラスで表されます。アプリケーションでこのディレクトリが表示されない場合でも心配しないでください - make:notification Artisan コマンドを実行すると自動的に作成されます:

php artisan make:notification InvoicePaid

このコマンドは新しい通知クラスを app/Notifications ディレクトリに配置します。各通知クラスには via メソッドと toMailtoDatabase などのメッセージ構築メソッドが含まれており、その特定のチャンネル向けに通知をメッセージに変換します。

通知の送信

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 メソッドがあります。通知は maildatabasebroadcastvonageslack チャネルで送信できます。

注記

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),
];
}

通知キュー接続のカスタマイズ

デフォルトでは、キューに入れられた通知はアプリケーションのデフォルトのキュー接続を使用してキューに入れられます。特定の通知に異なる接続を指定したい場合は、通知のコンストラクタから 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;

/**
* Create a new notification instance.
*/
public function __construct()
{
$this->onConnection('redis');
}
}

または、通知がサポートする各通知チャネルに使用される特定のキュー接続を指定したい場合は、通知に viaConnections メソッドを定義することができます。このメソッドは、チャネル名とキュー接続名のペアの配列を返す必要があります。

    /**
* Determine which connections should be used for each notification channel.
*
* @return array<string, string>
*/
public function viaConnections(): array
{
return [
'mail' => 'redis',
'database' => 'sync',
];
}

通知チャネルキューのカスタマイズ

通知がサポートする各通知チャネルに使用される特定のキューを指定したい場合は、通知に viaQueues メソッドを定義することができます。このメソッドは、チャネル名とキュー名のペアの配列を返す必要があります。

    /**
* Determine which queues should be used for each notification channel.
*
* @return array<string, string>
*/
public function viaQueues(): array
{
return [
'mail' => 'mail-queue',
'slack' => 'slack-queue',
];
}

キュー通知ミドルウェア

キュー通知は、キュージョブと同様にミドルウェアを定義できます。開始するには、通知クラスで middleware メソッドを定義します。middleware メソッドは、通知の宛先に基づいて返されるミドルウェアをカスタマイズするために $notifiable$channel 変数を受け取ります:

    use Illuminate\Queue\Middleware\RateLimited;

/**
* Get the middleware the notification job should pass through.
*
* @return array<int, object>
*/
public function middleware(object $notifiable, string $channel)
{
return match ($channel) {
'email' => [new RateLimited('postmark')],
'slack' => [new RateLimited('slack')],
default => [],
};
}

キュー通知とデータベーストランザクション

データベーストランザクション内でキュー通知がディスパッチされると、データベーストランザクションがコミットされる前にキューによって処理される可能性があります。これが発生すると、データベーストランザクション中にモデルやデータベースレコードに行った更新がまだデータベースに反映されていないかもしれません。さらに、トランザクション内で作成されたモデルやデータベースレコードはデータベースに存在しないかもしれません。通知がこれらのモデルに依存している場合、キュー通知を送信するジョブが処理される際に予期しないエラーが発生する可能性があります。

キュー接続の 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;

/**
* Create a new notification instance.
*/
public function __construct()
{
$this->afterCommit();
}
}

注記

これらの問題を回避する方法について詳しく知るには、キュージョブとデータベーストランザクションに関するドキュメントを参照してください。

キュー通知を送信する必要があるかどうかを判断する

キュー通知がバックグラウンド処理のためにキューにディスパッチされた後、通常はキューのワーカーによって受け入れられ、意図した受信者に送信されるでしょう。

ただし、キューのワーカーによって処理された後にキュー通知を送信するかどうかの最終決定を行いたい場合は、通知クラスに shouldSend メソッドを定義することができます。このメソッドが false を返すと、通知は送信されません:

    /**
* Determine if the notification should be sent.
*/
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', 'taylor@example.com')
->route('vonage', '5555555555')
->route('slack', '#slack-channel')
->route('broadcast', [new Channel('channel-name')])
->notify(new InvoicePaid($invoice));

オンデマンド通知を mail ルートに送信する際に受信者の名前を提供したい場合は、メールアドレスをキーとし、配列の最初の要素の値として名前を含む配列を提供できます:

    Notification::route('mail', [
'barrett@example.com' => 'Barrett Blair',
])->notify(new InvoicePaid($invoice));

routes メソッドを使用して、複数の通知チャンネルに対するアドホックなルーティング情報を一度に提供できます:

    Notification::routes([
'mail' => ['barrett@example.com' => 'Barrett Blair'],
'vonage' => '5555555555',
])->notify(new InvoicePaid($invoice));

メール通知

メールメッセージのフォーマット

通知がメールとして送信可能な場合は、通知クラスに toMail メソッドを定義する必要があります。このメソッドは $notifiable エンティティを受け取り、Illuminate\Notifications\Messages\MailMessage インスタンスを返す必要があります。

MailMessage クラスには、トランザクションメールメッセージを構築するのに役立ついくつかのシンプルなメソッドが含まれています。メールメッセージにはテキスト行や「アクションの呼び出し」が含まれる場合があります。例として toMail メソッドを見てみましょう:

    /**
* Get the mail representation of the notification.
*/
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 メソッドを使用すると、行動を起こすボタンが黒色ではなく赤色になります:

    /**
* Get the mail representation of the notification.
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->error()
->subject('Invoice Payment Failed')
->line('...');
}

その他のメール通知の書式オプション

通知クラスでテキストの「行」を定義する代わりに、通知メールをレンダリングするために使用するカスタムテンプレートを指定するために view メソッドを使用することができます:

    /**
* Get the mail representation of the notification.
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)->view(
'mail.invoice.paid', ['invoice' => $this->invoice]
);
}

view メソッドに渡される配列の2番目の要素としてビュー名を渡すことで、メールメッセージのためのプレーンテキストビューを指定することができます:

    /**
* Get the mail representation of the notification.
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)->view(
['mail.invoice.paid', 'mail.invoice.paid-text'],
['invoice' => $this->invoice]
);
}

また、メッセージにプレーンテキストビューのみがある場合は、text メソッドを利用することができます:

    /**
* Get the mail representation of the notification.
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)->text(
'mail.invoice.paid-text', ['invoice' => $this->invoice]
);
}

送信者のカスタマイズ

デフォルトでは、メールの送信者/送信元アドレスは config/mail.php 設定ファイルで定義されています。ただし、特定の通知の送信元アドレスを指定するには、from メソッドを使用してください:

    /**
* Get the mail representation of the notification.
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->from('barrett@example.com', '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;

/**
* Route notifications for the mail channel.
*
* @return array<string, string>|string
*/
public function routeNotificationForMail(Notification $notification): array|string
{
// Return email address only...
return $this->email_address;

// Return email address and name...
return [$this->email_address => $this->name];
}
}

件名のカスタマイズ

デフォルトでは、メールの件名は通知のクラス名が "タイトルケース" にフォーマットされます。つまり、通知クラスが InvoicePaid という名前の場合、メールの件名は Invoice Paid になります。メッセージの件名を指定する場合は、メッセージを構築する際に subject メソッドを呼び出すことができます:

    /**
* Get the mail representation of the notification.
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->subject('Notification Subject')
->line('...');
}

メーラーのカスタマイズ

デフォルトでは、メール通知は config/mail.php 構成ファイルで定義されたデフォルトのメーラーを使用して送信されます。ただし、メッセージを構築する際に mailer メソッドを呼び出すことで、実行時に異なるメーラーを指定することができます:

    /**
* Get the mail representation of the notification.
*/
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 メソッドは、最初の引数としてファイルの絶対パスを受け入れます:

    /**
* Get the mail representation of the notification.
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->greeting('Hello!')
->attach('/path/to/file');
}

注記

通知メールメッセージが提供する attach メソッドは、添付可能オブジェクトも受け入れます。詳細については包括的な 添付可能オブジェクトのドキュメント を参照してください。

メッセージにファイルを添付する際に、attach メソッドの第二引数として array を渡すことで、表示名と MIME タイプを指定することもできます:

    /**
* Get the mail representation of the notification.
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->greeting('Hello!')
->attach('/path/to/file', [
'as' => 'name.pdf',
'mime' => 'application/pdf',
]);
}

メーラブルオブジェクトでファイルを添付する場合とは異なり、attachFromStorage を使用してストレージディスクから直接ファイルを添付することはできません。代わりに、ストレージディスク上のファイルの絶対パスを使用して attach メソッドを使用するか、toMail メソッドから メーラブル を返すことができます。

    use App\Mail\InvoicePaid as InvoicePaidMailable;

/**
* Get the mail representation of the notification.
*/
public function toMail(object $notifiable): Mailable
{
return (new InvoicePaidMailable($this->invoice))
->to($notifiable->email)
->attachFromStorage('/path/to/file');
}

必要に応じて、attachMany メソッドを使用してメッセージに複数のファイルを添付することができます:

    /**
* Get the mail representation of the notification.
*/
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 メソッドを呼び出す際には、添付ファイルに割り当てるべきファイル名を指定する必要があります:

    /**
* Get the mail representation of the notification.
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->greeting('Hello!')
->attachData($this->pdf, 'name.pdf', [
'mime' => 'application/pdf',
]);
}

タグとメタデータの追加

Mailgun や Postmark などのサードパーティのメールプロバイダは、アプリケーションから送信されたメールをグループ化して追跡するために使用できるメッセージの「タグ」と「メタデータ」をサポートしています。tag メソッドと metadata メソッドを使用して、メールメッセージにタグとメタデータを追加することができます:

    /**
* Get the mail representation of the notification.
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->greeting('Comment Upvoted!')
->tag('upvote')
->metadata('comment_id', $this->comment->id);
}

アプリケーションが Mailgun ドライバを使用している場合は、Mailgun の tags および metadata に関するドキュメントを参照できます。同様に、Postmark のドキュメントも、tags および metadata に関するサポート情報を参照できます。

Amazon SES を使用してメールを送信している場合は、メッセージに SES "tags" を添付するために metadata メソッドを使用する必要があります。

Symfony メッセージのカスタマイズ

MailMessage クラスの withSymfonyMessage メソッドを使用すると、メッセージを送信する前に Symfony メッセージインスタンスを使用してクロージャを登録できます。これにより、メッセージを配信する前にメッセージを詳細にカスタマイズする機会が与えられます:

    use Symfony\Component\Mime\Email;

/**
* Get the mail representation of the notification.
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->withSymfonyMessage(function (Email $message) {
$message->getHeaders()->addTextHeader(
'Custom-Header', 'Header Value'
);
});
}

Mailable の使用

必要に応じて、通知の toMail メソッドから完全な mailable オブジェクト を返すことができます。MailMessage の代わりに Mailable を返す場合は、mailable オブジェクトの to メソッドを使用してメッセージの受信者を指定する必要があります:

    use App\Mail\InvoicePaid as InvoicePaidMailable;
use Illuminate\Mail\Mailable;

/**
* Get the mail representation of the notification.
*/
public function toMail(object $notifiable): Mailable
{
return (new InvoicePaidMailable($this->invoice))
->to($notifiable->email);
}

メーラブルとオンデマンド通知

オンデマンド通知を送信する場合、toMailメソッドに渡される$notifiableインスタンスはIlluminate\Notifications\AnonymousNotifiableのインスタンスになります。これには、オンデマンド通知を送信するためのメールアドレスを取得するために使用できるrouteNotificationForメソッドが提供されています:

    use App\Mail\InvoicePaid as InvoicePaidMailable;
use Illuminate\Notifications\AnonymousNotifiable;
use Illuminate\Mail\Mailable;

/**
* Get the mail representation of the notification.
*/
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メソッドを使用します。テンプレートで利用可能にしたいデータの配列をメソッドの第2引数として渡すことができます:```

    /**
* Get the mail representation of the notification.
*/
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つの引数を受け入れます。サポートされている色は、primarygreenredです。通知に必要なだけ多くのボタンコンポーネントを追加できます。

<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とテキストの表現を含むhtmlおよびtextディレクトリが含まれます。これらのコンポーネントを自由にカスタマイズできます。

CSSのカスタマイズ

コンポーネントをエクスポートした後、resources/views/vendor/mail/html/themesディレクトリにdefault.cssファイルが含まれています。このファイルのCSSをカスタマイズすると、スタイルが自動的にMarkdown通知のHTML表現内にインライン化されます。

新しいテーマを完全に構築したい場合は、LaravelのMarkdownコンポーネント用にCSSファイルをhtml/themesディレクトリに配置することができます。CSSファイルを命名して保存した後、mail構成ファイルのthemeオプションを新しいテーマの名前に合わせて更新してください。

個々の通知のテーマをカスタマイズするには、通知のメールメッセージを構築する際にthemeメソッドを呼び出すことができます。themeメソッドは、通知を送信する際に使用するべきテーマの名前を受け入れます:

    /**
* Get the mail representation of the notification.
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->theme('invoice')
->subject('Invoice Paid')
->markdown('mail.invoice.paid', ['url' => $url]);
}

データベース通知

前提条件

database通知チャネルは、通知情報をデータベーステーブルに保存します。このテーブルには、通知の種類や通知を記述するJSONデータ構造などの情報が含まれます。

このテーブルをクエリして、アプリケーションのユーザーインターフェースに通知を表示することができます。ただし、それを行う前に、通知を保持するデータベーステーブルを作成する必要があります。適切なテーブルスキーマを持つmigrationを生成するためにmake:notifications-tableコマンドを使用できます:

php artisan make:notifications-table

php artisan migrate
注記

もし通知可能なモデルがUUIDまたはULIDプライマリキーを使用している場合は、通知テーブルのmigrationでmorphsメソッドをuuidMorphsまたはulidMorphsに置き換えるべきです。

データベース通知のフォーマット

通知がデータベーステーブルに保存されることをサポートする場合は、通知クラスでtoDatabaseまたはtoArrayメソッドを定義する必要があります。このメソッドは$notifiableエンティティを受け取り、プレーンなPHP配列を返す必要があります。返された配列はJSONとしてエンコードされ、notificationsテーブルのdata列に保存されます。例としてtoArrayメソッドを見てみましょう:

    /**
* Get the array representation of the notification.
*
* @return array<string, mixed>
*/
public function toArray(object $notifiable): array
{
return [
'invoice_id' => $this->invoice->id,
'amount' => $this->invoice->amount,
];
}

通知がアプリケーションのデータベースに保存されると、type列に通知のクラス名が入ります。ただし、通知クラスでdatabaseTypeメソッドを定義することで、この動作をカスタマイズすることができます。

    /**
* Get the notification's database type.
*
* @return string
*/
public function databaseType(object $notifiable): string
{
return 'invoice-paid';
}

toDatabasetoArray

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 クライアントから通知にアクセスするには、アプリケーション用に通知コントローラーを定義し、現在のユーザーなどの通知可能なエンティティの通知を返す必要があります。その後、JavaScript クライアントからそのコントローラーの URL に HTTP リクエストを行うことができます。

通知を既読としてマークする

通常、ユーザーが通知を表示したときに通知を "既読" としてマークしたいと思うでしょう。Illuminate\Notifications\Notifiable トレイトには、通知のデータベースレコードの read_at カラムを更新する markAsRead メソッドが提供されています。

    $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()]);

通知を削除してテーブルから完全に削除することもできます:

    $user->notifications()->delete();

ブロードキャスト通知

前提条件

ブロードキャスト通知を行う前に、Laravelのevent broadcastingサービスを設定し、理解しておく必要があります。イベントブロードキャストは、JavaScriptで動作するフロントエンドからサーバーサイドのLaravelイベントに反応する方法を提供します。

ブロードキャスト通知のフォーマット

broadcast チャンネルは、Laravelのevent broadcastingサービスを使用して通知をブロードキャストし、JavaScriptで動作するフロントエンドがリアルタイムで通知をキャッチできるようにします。通知がブロードキャストをサポートしている場合、通知クラスに toBroadcast メソッドを定義できます。このメソッドは $notifiable エンティティを受け取り、BroadcastMessage インスタンスを返す必要があります。toBroadcast メソッドが存在しない場合、データをブロードキャストする必要があるデータを収集するために toArray メソッドが使用されます。返されたデータはJSONとしてエンコードされ、JavaScriptで動作するフロントエンドにブロードキャストされます。例として toBroadcast メソッドを見てみましょう:

    use Illuminate\Notifications\Messages\BroadcastMessage;

/**
* Get the broadcastable representation of the notification.
*/
public function toBroadcast(object $notifiable): BroadcastMessage
{
return new BroadcastMessage([
'invoice_id' => $this->invoice->id,
'amount' => $this->invoice->amount,
]);
}

ブロードキャストキューの設定

すべてのブロードキャスト通知はブロードキャストのためにキューに入れられます。ブロードキャスト操作をキューに入れる際に使用するキュー接続またはキュー名を構成したい場合は、BroadcastMessageonConnection メソッドや onQueue メソッドを使用できます:

    return (new BroadcastMessage($data))
->onConnection('sqs')
->onQueue('broadcasts');

通知タイプのカスタマイズ

指定したデータに加えて、すべてのブロードキャスト通知には通知の完全なクラス名を含む type フィールドもあります。通知の type をカスタマイズしたい場合は、通知クラスに broadcastType メソッドを定義できます:

    /**
* Get the type of the notification being broadcast.
*/
public function broadcastType(): string
{
return 'broadcast.message';
}

通知のリスニング

通知は、{notifiable}.{id} の形式を使用したプライベートチャンネルでブロードキャストされます。つまり、App\Models\User インスタンスのIDが 1 の場合、通知は 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;

/**
* The channels the user receives notification broadcasts on.
*/
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 のパブリックキーとシークレットキーを定義するために、単純に VONAGE_KEY および VONAGE_SECRET 環境変数を使用できます。

キーを定義した後は、デフォルトで SMS メッセージを送信する電話番号を定義する VONAGE_SMS_FROM 環境変数を設定する必要があります。この電話番号は Vonage コントロールパネル内で生成できます:

    VONAGE_SMS_FROM=15556666666

SMS 通知のフォーマット

通知が SMS として送信可能な場合は、通知クラスで toVonage メソッドを定義する必要があります。このメソッドは $notifiable エンティティを受け取り、Illuminate\Notifications\Messages\VonageMessage インスタンスを返す必要があります:

    use Illuminate\Notifications\Messages\VonageMessage;

/**
* Get the Vonage / SMS representation of the notification.
*/
public function toVonage(object $notifiable): VonageMessage
{
return (new VonageMessage)
->content('Your SMS message content');
}

Unicode Content

もしSMSメッセージにユニコード文字が含まれる場合は、VonageMessageインスタンスを構築する際にunicodeメソッドを呼び出す必要があります:

    use Illuminate\Notifications\Messages\VonageMessage;

/**
* Get the Vonage / SMS representation of the notification.
*/
public function toVonage(object $notifiable): VonageMessage
{
return (new VonageMessage)
->content('Your unicode message')
->unicode();
}

"From" 番号のカスタマイズ

VONAGE_SMS_FROM環境変数で指定された電話番号とは異なる電話番号から通知を送信したい場合は、VonageMessageインスタンスでfromメソッドを呼び出すことができます:

    use Illuminate\Notifications\Messages\VonageMessage;

/**
* Get the Vonage / SMS representation of the notification.
*/
public function toVonage(object $notifiable): VonageMessage
{
return (new VonageMessage)
->content('Your SMS message content')
->from('15554443333');
}

クライアント参照の追加

ユーザー、チーム、またはクライアントごとのコストを追跡したい場合は、通知に「クライアント参照」を追加することができます。Vonageはこのクライアント参照を使用して、特定の顧客のSMS利用状況をよりよく理解できるようにレポートを生成することができます。クライアント参照は最大40文字までの任意の文字列です:

    use Illuminate\Notifications\Messages\VonageMessage;

/**
* Get the Vonage / SMS representation of the notification.
*/
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;

/**
* Route notifications for the Vonage channel.
*/
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:writechat:write.publicchat: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'),
],
],

アプリの配布

アプリケーションが、アプリケーションのユーザーが所有する外部のSlackワークスペースに通知を送信する場合、Slackを介してアプリを「配布」する必要があります。アプリの配布は、Slack内のアプリの「配布の管理」タブから管理できます。アプリが配布されると、Socialiteを使用して、アプリケーションのユーザーの代わりにSlackボットトークンを取得できます。

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;

/**
* Get the Slack representation of the notification.
*/
public function toSlack(object $notifiable): SlackMessage
{
return (new SlackMessage)
->text('One of your invoices has been paid!')
->headerBlock('Invoice Paid')
->contextBlock(function (ContextBlock $block) {
$block->text('Customer #1234');
})
->sectionBlock(function (SectionBlock $block) {
$block->text('An invoice has been paid.');
$block->field("*Invoice No:*\n1000")->markdown();
$block->field("*Invoice Recipient:*\ntaylor@laravel.com")->markdown();
})
->dividerBlock()
->sectionBlock(function (SectionBlock $block) {
$block->text('Congratulations!');
});
}

Slackインタラクティビティ

SlackのBlock Kit通知システムには、ユーザーのインタラクションを処理する強力な機能が備わっています。これらの機能を利用するには、Slackアプリに「インタラクティビティ」が有効になっており、「リクエストURL」がアプリケーションで提供されるURLを指すように構成されている必要があります。これらの設定は、Slack内の「インタラクティビティ&ショートカット」アプリ管理タブから管理できます。

以下の例では、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;

/**
* Get the Slack representation of the notification.
*/
public function toSlack(object $notifiable): SlackMessage
{
return (new SlackMessage)
->text('One of your invoices has been paid!')
->headerBlock('Invoice Paid')
->contextBlock(function (ContextBlock $block) {
$block->text('Customer #1234');
})
->sectionBlock(function (SectionBlock $block) {
$block->text('An invoice has been paid.');
})
->actionsBlock(function (ActionsBlock $block) {
// ID defaults to "button_acknowledge_invoice"...
$block->button('Acknowledge Invoice')->primary();

// Manually configure the ID...
$block->button('Deny')->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;

/**
* Get the Slack representation of the notification.
*/
public function toSlack(object $notifiable): SlackMessage
{
return (new SlackMessage)
->text('One of your invoices has been paid!')
->headerBlock('Invoice Paid')
->contextBlock(function (ContextBlock $block) {
$block->text('Customer #1234');
})
->sectionBlock(function (SectionBlock $block) {
$block->text('An invoice has been paid.');
})
->actionsBlock(function (ActionsBlock $block) {
$block->button('Acknowledge Invoice')
->primary()
->confirm(
'Acknowledge the payment and send a thank you email?',
function (ConfirmObject $dialog) {
$dialog->confirm('Yes');
$dialog->deny('No');
}
);
});
}

Slackブロックの検査

構築しているブロックを素早く検査したい場合は、SlackMessageインスタンスでddメソッドを呼び出すことができます。ddメソッドは、ブラウザでペイロードと通知のプレビューを表示するSlackのBlock Kit BuilderへのURLを生成およびダンプします。ddメソッドにtrueを渡すと、生のペイロードをダンプできます:

    return (new SlackMessage)
->text('One of your invoices has been paid!')
->headerBlock('Invoice Paid')
->dd();

Slack通知のルーティング

適切なSlackチームとチャンネルにSlack通知を送信するには、通知可能なモデルでrouteNotificationForSlackメソッドを定義します。このメソッドは次のいずれかの値を返すことができます:

  • null - 通知自体で構成されたチャンネルにルーティングを遅延させます。SlackMessageを構築する際にtoメソッドを使用して通知内のチャンネルを構成できます。
  • Slackチャンネルを指定する文字列、例:#support-channel
  • OAuthトークンとチャンネル名を指定できるSlackRouteインスタンス、例:SlackRoute::make($this->slack_channel, $this->slack_token)。このメソッドは外部ワークスペースに通知を送信するために使用する必要があります。

たとえば、routeNotificationForSlack メソッドから #support-channel を返すと、アプリケーションの services.php 構成ファイルにある Bot User 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;

/**
* Route notifications for the Slack channel.
*/
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;

/**
* Route notifications for the Slack channel.
*/
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'));

複数の通知エントリのローカライズも Notification ファサードを介して達成できます:

    Notification::locale('es')->send(
$users, new InvoicePaid($invoice)
);

ユーザーの選択したロケール

時々、アプリケーションは各ユーザーの選択したロケールを保存します。通知可能なモデルに HasLocalePreference コントラクトを実装することで、Laravel に通知を送信する際にこの保存されたロケールを使用するよう指示できます:

    use Illuminate\Contracts\Translation\HasLocalePreference;

class User extends Model implements HasLocalePreference
{
/**
* Get the user's preferred locale.
*/
public function preferredLocale(): string
{
return $this->locale;
}
}

インターフェースを実装した後は、Laravel はモデルに通知やメールを送信する際に自動的に選択したロケールを使用します。したがって、このインターフェースを使用する際に locale メソッドを呼び出す必要はありません:

    $user->notify(new InvoicePaid($invoice));

テスト

Notification ファサードの fake メソッドを使用して、通知の送信を防ぐことができます。通常、通知の送信は実際にテストしているコードとは関係ありません。おそらく、Laravel が指示された通知を送信するようになったことを単にアサートするだけで十分です。

Notification ファサードの fake メソッドを呼び出した後、ユーザーに通知を送信するように指示されたことをアサートし、通知が受け取ったデータを検査することさえできます:

<?php

use App\Notifications\OrderShipped;
use Illuminate\Support\Facades\Notification;

test('orders can be shipped', function () {
Notification::fake();

// Perform order shipping...

// Assert that no notifications were sent...
Notification::assertNothingSent();

// Assert a notification was sent to the given users...
Notification::assertSentTo(
[$user], OrderShipped::class
);

// Assert a notification was not sent...
Notification::assertNotSentTo(
[$user], AnotherNotification::class
);

// Assert that a given number of notifications were sent...
Notification::assertCount(3);
});
<?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();

// Perform order shipping...

// Assert that no notifications were sent...
Notification::assertNothingSent();

// Assert a notification was sent to the given users...
Notification::assertSentTo(
[$user], OrderShipped::class
);

// Assert a notification was not sent...
Notification::assertNotSentTo(
[$user], AnotherNotification::class
);

// Assert that a given number of notifications were sent...
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 メソッドの第二引数にクロージャを渡すことで、オンデマンド通知が正しい "route" アドレスに送信されたかどうかを判定できます:

    Notification::assertSentOnDemand(
OrderShipped::class,
function (OrderShipped $notification, array $channels, object $notifiable) use ($user) {
return $notifiable->routes['mail'] === $user->email;
}
);

通知イベント

通知送信イベント

通知が送信されると、通知システムによって Illuminate\Notifications\Events\NotificationSending イベントがディスパッチされます。これには「通知可能」なエンティティと通知インスタンス自体が含まれています。アプリケーション内でこのイベントのための イベントリスナー を作成することができます:

    use Illuminate\Notifications\Events\NotificationSending;

class CheckNotificationStatus
{
/**
* Handle the given event.
*/
public function handle(NotificationSending $event): void
{
// ...
}
}

NotificationSending イベントのイベントリスナーが handle メソッドから false を返す場合、通知は送信されません:

    /**
* Handle the given event.
*/
public function handle(NotificationSending $event): bool
{
return false;
}

イベントリスナー内では、イベントの notifiablenotificationchannel プロパティにアクセスして、通知の受信者や通知自体について詳細を知ることができます:

    /**
* Handle the given event.
*/
public function handle(NotificationSending $event): void
{
// $event->channel
// $event->notifiable
// $event->notification
}

通知送信イベント

通知が送信されると、Illuminate\Notifications\Events\NotificationSent イベント が通知システムによってディスパッチされます。これには「通知可能」なエンティティと通知インスタンス自体が含まれています。アプリケーション内でこのイベントのための イベントリスナー を作成することができます:

    use Illuminate\Notifications\Events\NotificationSent;

class LogNotification
{
/**
* Handle the given event.
*/
public function handle(NotificationSent $event): void
{
// ...
}
}

イベントリスナー内では、イベントの notifiablenotificationchannelresponse プロパティにアクセスして、通知の受信者や通知自体について詳細を知ることができます:

    /**
* Handle the given event.
*/
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
{
/**
* Send the given notification.
*/
public function send(object $notifiable, Notification $notification): void
{
$message = $notification->toVoice($notifiable);

// Send notification to the $notifiable instance...
}
}

通知チャネルクラスが定義されたら、通知の 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
{
// ...
}
}