Notifications
Table of Contents
Introduction
email の送信をサポートするだけでなく、Laravel は email、SMS(Vonage (旧 Nexmo)を通じて)、そしてSlack を含むさまざまな配信 channel を通じて通知を送信するサポートを提供しています。さらに、コミュニティが作った通知 channel のバリエーションが数十種類に渡って作成され、通知をさまざまな channel で送信することができます! 通知は database に保存することも可能ですので、あなたの web インターフェースで表示することができます。
通常、 notifications は、 users に何かがあなたの application で何が起こったかを通知するための短い情報メッセージであるべきです。たとえば、請求書 application を作成している場合、Invoice Paid の notification を email や SMS チャネルを介して users に送るかもしれません。
Generating Notifications
Laravel では、各 notification は通常app/Notifications
ディレクトリに格納される single class によって表現されます。このディレクトリがあなたの application にないのを見つけても心配しないでください - make:notification
Artisan command を実行するときにあなたのために作成されます:
php artisan make:notification InvoicePaid
この command は、新規の notification class をあなたの app/Notifications
ディレクトリに配置します。各 notification class には、via
method と、toMail
や toDatabase
のような、 notification を特定の channel に適したメッセージに変換するためのメッセージ作成メソッドが複数含まれています。
Sending Notifications
Notifiable Trait の使用
通知は 2 つの方法で送信することができます。 Notifiable
トレイトの notify
method を使用するか、Notification
facadeを使用します。Notifiable
トレイトは、default で application の App\Models\User
model に含まれています:
<?php
namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable
{
use Notifiable;
}
このトレイトが提供するnotify
method は、 notification インスタンスを受け取ることを期待しています:
use App\Notifications\InvoicePaid;
$user->notify(new InvoicePaid($invoice));
NOTE
忘れないでください、あなたは
Notifiable
トレイトをあなたの model のいずれにも使用することができます。これをあなたのUser
models にのみ含めることに制限されているわけではありません。
Notification Facade の使用
あるいは、Notification
facadeを通じて通知を送信することもできます。このアプローチは、users の collection など、複数の通知可能なエンティティに通知を送信する必要がある場合に便利です。facade を使用して通知を送信するには、すべての通知可能なエンティティと通知のインスタンスをsend
method に渡します:
use Illuminate\Support\Facades\Notification;
Notification::send($users, new InvoicePaid($invoice));
あなたはまた、sendNow
の method を使用して notifications をすぐに送信することもできます。この method は、 notification がShouldQueue
インターフェースを実装していても、すぐに notification を送信します。
Notification::sendNow($developers, new DeploymentCompleted($deployment));
配信チャンネルの指定
すべての notification class は、via
method を持っており、それによって notification が配信されるチャネルが決定されます。 Notifications は、mail
、database
、broadcast
、vonage
、slack
チャネルで送信することが可能です。
NOTE
Telegram や Pusher などの他の配信チャンネルを使用したい場合は、コミュニティが推進しているLaravel Notification Channels website をチェックしてみてください。
via
method は$notifiable
インスタンスを受け取り、これは notification が送信される class のインスタンスになります。$notifiable
を使用して、 notification が配信されるべきチャネルを決定することができます。
/**
* Get the notification's delivery channels.
*
* @return array<int, string>
*/
public function via(object $notifiable): array
{
return $notifiable->prefers_sms ? ['vonage'] : ['mail', 'database'];
}
Notifications のキューイング
WARNING
notifications をキューに入れる前に、あなたの queue を設定し、ワーカーを起動する必要があります。
ShouldQueue
インターフェースと Queueable
トレイトをあなたの class に追加することで、 notification を queue に入れさせ、application の response 時間を短縮させてください。インターフェースとトレイトは、すべての notifications に対して make:notification
command を使用して生成されているため、すぐにあなたの notification class に追加することができます。
<?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
インターフェースが notification に追加されると、通常通りに notification を送信できます。 Laravel は class 上のShouldQueue
インターフェースを検出し、 notification の配送を自動的に queue します。
$user->notify(new InvoicePaid($invoice));
notifications を queue に入れるとき、それぞれの受信者と channel の組み合わせについて queue に入れられた job が作成されます。例えば、あなたの notification が 3 つの受信者と 2 つの channel を持っている場合、6 つの jobs が queue に派遣されます。
Notifications の遅延
もし通知の配信を delay したい場合は、delay
method を通知のインスタンス化にチェーンすることができます。
$delay = now()->addMinutes(10);
$user->notify((new InvoicePaid($invoice))->delay($delay));
特定のチャンネルに対して delay の量を指定するために、delay
method に array を渡すことができます:
$user->notify((new InvoicePaid($invoice))->delay([
'mail' => now()->addMinutes(5),
'sms' => now()->addMinutes(10),
]));
あるいは、withDelay
method を notification class 自体に定義することもできます。withDelay
method は、 channel の名前と delay values の array を返す必要があります:
/**
* 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),
];
}
Notification Queue Connection のカスタマイズ
default として、queue プされた通知は、application の default の queue 接続を使用して queue イングされます。特定の通知に対して使用するべき異なる接続を指定したい場合は、通知のコンストラクタからonConnection
method を呼び出すことができます。
<?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');
}
}
または、 notification でサポートされている各 notification channel に使用されるべき特定の queue connection を指定したい場合は、 notification 上にviaConnections
method を定義することができます。この method は、 channel 名/ queue connection 名のペアの array を返すべきです:
/**
* Determine which connections should be used for each notification channel.
*
* @return array<string, string>
*/
public function viaConnections(): array
{
return [
'mail' => 'redis',
'database' => 'sync',
];
}
Notification Channel Queues のカスタマイズ
特定の queue をそれぞれの notification channel で使用すべきものとして指定したい場合、notification でviaQueues
method を定義することができます。この method は、channel 名 / queue 名のペアの array を返すべきです:
/**
* 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',
];
}
キューに入った Notification Middleware
キューに入れられた notifications は、キューに入れられた jobs と同様に middleware を定義することができます。始めるには、あなたの notification class に middleware
method を定義してください。middleware
method は $notifiable
と $channel
変数を受け取り、これにより通知の宛先に基づいて返される middleware をカスタマイズすることができます:
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 => [],
};
}
キューに入れられた Notifications と Database Transactions
database transaction 内で通知が queue に追加されるとき、それらは database transaction がコミットされる前に queue によって処理される可能性があります。これが起こると、database transaction の間に models や database のレコードに行った更新は、まだ database に反映されていない可能性があります。さらに、transaction 内で作成された models や database のレコードは、database に存在していないかもしれません。通知がこれらの models に依存している場合、queue に追加された通知を送信する job が処理されるときに予期しない errors が発生する可能性があります。
あなたの queue 接続の after_commit
設定オプションが false
に設定されている場合でも、特定のキュー notification がすべてのオープンな database transactions がコミットされた後にディスパッチされるべきであることを、 notification を送信するときに afterCommit
method を呼び出すことで示すことができます。
use App\Notifications\InvoicePaid;
$user->notify((new InvoicePaid($invoice))->afterCommit());
あるいは、通知のコンストラクタから afterCommit
method を呼び出すこともできます:
<?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();
}
}
NOTE
これらの問題を回避する方法について詳しく知るために、キュー内の jobs と database transactionsに関するドキュメンテーションをご覧ください。
キューに入れられた Notification が送信されるべきかどうかを判断する
キューに入った notification が queue でバックグラウンドの processing のために配信された後、通常は queue のワーカーに受け入れられ、その意図した受信者に送信されます。
しかし、キュー queue ワーカーによって処理された後に、キューに入れられた notification が送信すべきか否かの最終的な判断を自分で下したい場合は、 shouldSend
method を notification class に定義することができます。この method が false
を返す場合、 notification は送信されません:
/**
* Determine if the notification should be sent.
*/
public function shouldSend(object $notifiable, string $channel): bool
{
return $this->invoice->isPaid();
}
リクエストに応じた Notifications
時折、あなたが所有する application の"ユーザー"として保存されていない誰かに notification を送る必要があるかもしれません。Notification
ファサードのroute
method を使用すれば、 notification を送信する前に、アドホックな notification routing 情報を指定することができます。
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));
オンデマンドの notification をmail
の route に送信する際に受信者の名前を提供したい場合は、email アドレスを key とし、名前を最初の要素の value とする array を提供することができます:
Notification::route('mail', [
'barrett@example.com' => 'Barrett Blair',
])->notify(new InvoicePaid($invoice));
routes
という method を使用すると、複数の notification チャネルに対する一時的な routing 情報を一度に提供することができます:
Notification::routes([
'mail' => ['barrett@example.com' => 'Barrett Blair'],
'vonage' => '5555555555',
])->notify(new InvoicePaid($invoice));
Mail Notifications
Mail メッセージの書式設定
もし notification が email として送信されることをサポートしている場合、あなたは notification class の上で toMail
method を定義するべきです。この method は $notifiable
エンティティを受け取り、Illuminate\Notifications\Messages\MailMessage
インスタンスを戻すべきです。
MailMessage
class には、transactiontypes の Mail メッセージを構築するためのいくつかのシンプルなメソッドが含まれています。Mail メッセージにはテキストの行と、"call to action"という行動を促すフレーズが含まれることがあります。ここで、toMail
method の一例を見てみましょう:
/**
* 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!');
}
NOTE
注意してください、我々は
$this->invoice->id
をtoMail
method で使用しています。あなたは、 notification がそのメッセージを生成するために必要な任意の data を通知のコンストラクターに渡すことができます。
この例では、挨拶、テキストの行、 action の呼び出し、そしてもう一行のテキストを register します。これらのメソッドは、MailMessage
object が提供するもので、小さなトランザクションメールを簡単かつ迅速にフォーマットすることができます。 mail channel は、メッセージのコンポーネントを美しく、レスポンシブな HTML email テンプレートとそのプレーンテキスト版に変換します。以下は、mail
channel によって生成された email の例です。
NOTE
mail 通知を送信する際には、必ず
config/app.php
設定ファイルのname
設定 option を設定してください。この value は、mail 通知メッセージの header とフッターで使用されます。
Error メッセージ
いくつかの notifications は、 users に errors を伝えます。たとえば、請求書の支払いが失敗した場合などです。あなたは、 mail メッセージが error に関するものであることを示すために、メッセージを作成する際にerror
method を呼び出すことができます。 mail メッセージでerror
method を使用すると、 action button は黒ではなく赤になります。
/**
* Get the mail representation of the notification.
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->error()
->subject('Invoice Payment Failed')
->line('...');
}
他の Mail Notification フォーマット Options
テキストの lines を notification class で定義する代わりに、view
method を使って、 custom テンプレートを指定し、 notification email を render するためのテンプレートを指定することができます:
/**
* Get the mail representation of the notification.
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)->view(
'mail.invoice.paid', ['invoice' => $this->invoice]
);
}
view
method に渡される array の二番目の要素として、mail メッセージのためのプレーンテキスト view を指定することができます。
/**
* 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]
);
}
または、あなたのメッセージがプレーンテキストの view しか持っていない場合は、text
method を利用することができます:
/**
* Get the mail representation of the notification.
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)->text(
'mail.invoice.paid-text', ['invoice' => $this->invoice]
);
}
送信者のカスタマイズ
default で、mail の送信者/送信元のアドレスは config/mail.php
設定ファイルで定義されています。しかし、特定の通知の送信元アドレスを from
method を使って指定することもできます。
/**
* Get the mail representation of the notification.
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->from('barrett@example.com', 'Barrett Blair')
->line('...');
}
受信者のカスタマイズ
mail
channel を介して通知を送信する際、通知システムは自動的に通知可能なエンティティの email
プロパティを探します。routeNotificationForMail
method を通知可能なエンティティで定義することで、通知の配信に使用する mail アドレスをカスタマイズすることができます。
<?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];
}
}
件名のカスタマイズ
default "では、メールの件名は" notification "の" class "名が "Title Case"でフォーマットされます。したがって、あなたの" notification class "がInvoicePaid
という名前の場合、メールの件名はInvoice Paid
になります。メッセージの異なる件名を指定したい場合は、メッセージを作成する際にsubject
" method "を呼び出すことができます。
/**
* Get the mail representation of the notification.
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->subject('Notification Subject')
->line('...');
}
Mailer のカスタマイズ
default として、mail 通知はconfig/mail.php
設定ファイルで定義された default メーラーを使用して送信されます。ただし、メッセージの作成時にmailer
method を呼び出すことで、ランタイムで異なるメーラーを指定できます。
/**
* Get the mail representation of the notification.
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->mailer('postmark')
->line('...');
}
テンプレートのカスタマイズ
mail notifications で使用される HTML とプレーンテキストのテンプレートは、 notification パッケージの resources を公開することで修正できます。この command を実行した後、 mail notification のテンプレートは resources/views/vendor/notifications
ディレクトリに配置されます:
php artisan vendor:publish --tag=laravel-notifications
Attachments
email notification に添付ファイルを追加するには、メッセージ作成時にattach
method を使用します。attach
method は最初の引数としてファイルへの絶対 path を受け入れます:
/**
* Get the mail representation of the notification.
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->greeting('Hello!')
->attach('/path/to/file');
}
NOTE
attach
method は、notification mail メッセージによって提供され、またattach 可能なオブジェクトも受け入れます。詳細については、詳細なattach 可能な object ドキュメンテーションをご覧ください。
メッセージにファイルを添付する際には、表示名や MIME type を、二つ目の引数としてarray
を attach
method に渡すことで指定することもできます。
/**
* 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',
]);
}
mailable オブジェクトにファイルを添付するのとは異なり、attachFromStorage
を使用して直接 storage ディスクからファイルを attach することはできません。むしろ、attach
の method を使用し、 storage ディスク上のファイルまでの絶対 path を使用する必要があります。あるいは、toMail
の method からmailableを返すこともできます:
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
method を使用して添付することができます。
/**
* 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',
],
]);
}
Raw Data Attachments
attachData
method は、添付ファイルとしてバイトの string を attach するために使用できます。attachData
method を呼び出すときは、添付ファイルに割り当てるべきファイル名を提供する必要があります:
/**
* 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',
]);
}
Tags と Metadata の追加
Mailgun や Postmark などのサードパーティの email providers は、メッセージの"tags"と"metadata"をサポートしており、これらはあなたの application から送信された mail をグループ化し、追跡するために使用することができます。tag
およびmetadata
method を通じて、email メッセージに tags と 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);
}
あなたの application が Mailgun の driver を使用している場合、詳細な情報を得るために Mailgun のドキュメンテーションを参照することができます。tags やmetadata についても同様です。同様に、Postmark のドキュメンテーションも、彼らのtags やmetadata に関するサポートの詳細な情報を得るために参照することができます
あなたのアプリケーションが Amazon SES を使用してメールを送信している場合、メッセージにSES "tags" を添付するためにmetadata
メソッドを使用するべきです。
Customizing the Symfony Message
MailMessage
のwithSymfonyMessage
method を使うことで、メッセージを送信する前に Symfony Message インスタンスとともに呼び出されるクロージャを登録することができます。これにより、メッセージが配信される前にメッセージを深くカスタマイズする機会が得られます:
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'
);
});
}
Mailables の使用
必要に応じて、通知の toMail
method から完全な mailable object を返すことができます。MailMessage
の代わりに Mailable
を返す場合は、mailable オブジェクトの to
method を使用してメッセージの受信者を指定する必要があります:
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);
}
メーラブルとオンデマンド Notifications
on-demand notificationを送信している場合、toMail
method に与えられる$notifiable
インスタンスは、Illuminate\Notifications\AnonymousNotifiable
のインスタンスとなります。これは、オンデマンドの notification が送信されるべき email アドレスを取得するために使用できるrouteNotificationFor
method を提供します。
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);
}
Mail Notifications のプレビュー
mail notification テンプレートを設計する際には、 mail メッセージを典型的な Blade テンプレートのようにブラウザで素早くプレビューすることが便利です。このため、 Laravel では、 route クロージャーまたは controller から直接 mail notification によって生成された任意の mail メッセージを返すことを許可しています。MailMessage
が返されると、それはレンダリングされてブラウザに表示され、実際の email アドレスに送信することなくすぐにそのデザインをプレビューすることができます:
use App\Models\Invoice;
use App\Notifications\InvoicePaid;
Route::get('/notification', function () {
$invoice = Invoice::find(1);
return (new InvoicePaid($invoice))
->toMail($invoice->user);
});
Markdown Mail Notifications
Markdown mail notifications により、あなたは mail notifications の事前に作成されたテンプレートを利用しながら、より自由に長いカスタマイズされたメッセージを書くことができます。メッセージが Markdown で書かれているため、 Laravel は美しい、 レスポンシブな HTML テンプレートをメッセージ用に render するとともに、プレーンテキストの対応部分も自動的に生成することができます。
メッセージの生成
対応する Markdown テンプレートで notification を生成するには、make:notification
の--markdown
オプションを使用することで、 Artisan command を使用できます。
php artisan make:notification InvoicePaid --markdown=mail.invoice.paid
他の全ての mail notifications と同様に、 Markdown テンプレートを使用する notifications は、その notification class 上にtoMail
method を定義すべきです。しかし、 notification を構築するためにline
やaction
メソッドを使用する代わりに、使用すべき Markdown テンプレートの名前を指定するためにmarkdown
method を使用します。テンプレートに利用可能にしたい data の array は、メソッドの 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 mail notifications は、 Blade コンポーネントと Markdown syntax を組み合わせて使用し、簡単に notifications を作成しながら、Laravel の事前に作成された notification コンポーネントを活用できます:
<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>
Button Component
button component は、中央に配置された button リンクをレンダリングします。 component は、url
とオプションのcolor
の 2 つの引数を受け入れます。サポートされている色はprimary
、green
、red
です。 notification にたくさんの button コンポーネントを追加しても構いません。
<x-mail::button :url="$url" color="green">
View Invoice
</x-mail::button>
Panel Component
パネルの component は、他の notification 部分とは若干異なる背景色を持つパネルに与えられたテキストブロックをレンダリングします。これにより、特定のテキストブロックに注目を引くことができます:
<x-mail::panel>
This is the panel content.
</x-mail::panel>
Table Component
このテーブルの component は、あなたが Markdown のテーブルを HTML のテーブルに transform できるようにします。 component は、 content として Markdown のテーブルを受け入れます。テーブルの column の整列は、 default Markdown のテーブル整列の syntax を使用してサポートされています。
<x-mail::table>
| Laravel | Table | Example |
| ------------- |:-------------:| --------:|
| Col 2 is | Centered | $10 |
| Col 3 is | Right-Aligned | $20 |
</x-mail::table>
Customizing the Components
すべての Markdown notification コンポーネントを自身の application にカスタマイズのためにエクスポートすることができます。コンポーネントをエクスポートするには、laravel-mail
アセットタグを publish するために vendor:publish
Artisan command を使用してください。
php artisan vendor:publish --tag=laravel-mail
この command は Markdown mail コンポーネントを resources/views/vendor/mail
ディレクトリに publish します。 mail
ディレクトリには、それぞれ利用可能な component のそれぞれの表現を含む html
と text
ディレクトリが含まれています。これらのコンポーネントは自由にカスタマイズすることができます。
Customizing the CSS
コンポーネントをエクスポートした後、resources/views/vendor/mail/html/themes
ディレクトリには default.css
ファイルが含まれます。このファイルの CSS をカスタマイズすると、スタイルが自動的に HTML 表現の中にインライン化され、あなたの Markdown notifications に反映されます。
もしあなたが Laravel の Markdown コンポーネントで全く新しいテーマを build したいと思うならば、html/themes
ディレクトリ内に CSS ファイルを配置することができます。あなたの CSS ファイルの命名と保存が終わったら、mail
設定ファイルのtheme
オプションを update して、新しいテーマの名前と match させてください。
個々の notification のテーマをカスタマイズするには、通知の mail メッセージを作成中に theme
method を呼び出すことができます。この theme
method は、 notification を送信する際に使用するべきテーマの名前を受け入れます:
/**
* 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 Notifications
Prerequisites
database
の notification channel は、 notification の情報を database のテーブルに保存します。このテーブルには、 notification type や、 notification を記述する JSON data の構造などの情報が含まれます。
アプリケーションの user インターフェースで notifications を表示するためにテーブルを query することができます。しかし、それを行う前に、notifications を保持するための database テーブルを作成する必要があります。make:notifications-table
command を使用して、適切なテーブル schema を持つ migration を生成することができます:
php artisan make:notifications-table
php artisan migrate
NOTE
通知可能な models が UUID または ULID の primary keyを使用している場合、
morphs
method をは、通知テーブルの migration でuuidMorphs
またはulidMorphs
に置き換える必要があります。
Database Notifications のフォーマット
もし notification が database テーブルに格納されることを支持している場合、toDatabase
または toArray
の method を notification class 上に定義するべきです。この method は $notifiable
エンティティを受け取り、プレーンな PHP の array を返すべきです。返された array は JSON としてエンコードされ、notifications
テーブルのdata
column に保存されます。以下に toArray
method の一例を見てみましょう:
/**
* 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,
];
}
notification があなたのアプリケーションの database に保存されるとき、type
column は通知の class 名で埋められます。しかし、databaseType
method をあなたの notification class に定義することで、この動作をカスタマイズすることができます。
/**
* Get the notification's database type.
*
* @return string
*/
public function databaseType(object $notifiable): string
{
return 'invoice-paid';
}
toDatabase
対 toArray
toArray
method は、broadcast
channel が JavaScript で動くフロントエンドに対してどの data を broadcast するべきかを決定するためにも使用されます。もし、database
と broadcast
チャンネルのために二つの異なる array の表現を持ちたいのであれば、toArray
method の代わりにtoDatabase
method を定義すべきです。
Notifications にアクセスする
notifications が database に保存されたら、通知可能エンティティからそれらにアクセスする便利な方法が必要です。Laravel の default App\Models\User
model に含まれている Illuminate\Notifications\Notifiable
トレイトには、エンティティの通知を返す notifications
Eloquent relationship が含まれています。通知をフェッチするには、この method に他の Eloquent relationship と同様にアクセスできます。デフォルトでは、通知は created_at
timestamp によってソートされ、最新の notifications が collection の先頭に表示されます:
$user = App\Models\User::find(1);
foreach ($user->notifications as $notification) {
echo $notification->type;
}
もし "unread" 通知だけを取り出したい場合、unreadNotifications
のリレーションシップを利用できます。再度の強調ですが、これらの 通知は、最新の 通知から順に created_at
timestamp によって整列され、collection の先頭に配置されます。
$user = App\Models\User::find(1);
foreach ($user->unreadNotifications as $notification) {
echo $notification->type;
}
NOTE
あなたの JavaScript client から notifications にアクセスするには、通知可能なエンティティ、例えば現在の user の notifications を返す application のための notification controller を定義する必要があります。その後、 JavaScript client からそのコントローラーの URL へ HTTP request を作成することができます。
Notifications を既読にする
通常、user がそれを閲覧した時に通知を"既読"にしたいと思うでしょう。Illuminate\Notifications\Notifiable
トレイトはmarkAsRead
という method を提供しており、通知の database レコード上のread_at
という column を更新します。
$user = App\Models\User::find(1);
foreach ($user->unreadNotifications as $notification) {
$notification->markAsRead();
}
しかし、それぞれの notification をループする代わりに、markAsRead
method を notifications の collection に直接使用することができます。
$user->unreadNotifications->markAsRead();
また、すべての notifications を取得せずに既読とマークするために、マス更新 query を使用することもできます database :
$user = App\Models\User::find(1);
$user->unreadNotifications()->update(['read_at' => now()]);
テーブルから完全に削除するために、 notifications をdelete
することができます:
$user->notifications()->delete();
Broadcast Notifications
Prerequisites
broadcasting notifications を開始する前に、Laravel のEvent broadcasting services を設定し、使いこなすべきです。 event broadcasting は、サーバーサイドの Laravel events に対して、あなたの JavaScript で作動するフロントエンドから反応する方法を提供します。
Broadcast Notifications のフォーマット指定
broadcast
channel は Laravel のevent ブロードキャスティング services を使用して、通知をリアルタイムで JavaScript 駆動のフロントエンドに broadcast します。 通知が broadcast をサポートしている場合、toBroadcast
method を 通知 class に定義することができます。この method は $notifiable
エンティティを受け取り、BroadcastMessage
インスタンスを返すべきです。toBroadcast
method が存在しない場合、toArray
method が broadcast すべき data を集めるために使用されます。返された data は JSON としてエンコードされ、JavaScript 駆動のフロントエンドに broadcast されます。toBroadcast
method の例を見てみましょう:
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,
]);
}
Broadcast Queue の設定
すべての broadcast notifications は broadcasting のためにキューに入れられています。もし queue connection や queue の名前を設定し、 broadcast 操作を queue に入れたい場合は、BroadcastMessage
のonConnection
およびonQueue
メソッドを使用できます。
return (new BroadcastMessage($data))
->onConnection('sqs')
->onQueue('broadcasts');
Notification Type のカスタマイズ
指定した data に加えて、すべての broadcast notifications には class の完全な名前を含む type
フィールドもあります。 notification のtype
をカスタマイズしたい場合は、broadcastType
method を notification class に定義することができます。
/**
* Get the type of the notification being broadcast.
*/
public function broadcastType(): string
{
return 'broadcast.message';
}
Notifications の通知を待ち受ける
通知はプライベート channel 上で放送され、{notifiable}.{id}
の規則で形式化されます。したがって、ID が1
のApp\Models\User
インスタンスに通知を送信している場合、その通知はApp.Models.User.1
のプライベート channel で放送されます。Laravel Echoを使用すると、channel 上の通知を簡単に監視することができます。notification
method を使用してください:
Echo.private('App.Models.User.' + userId)
.notification((notification) => {
console.log(notification.type);
});
Notification Channel のカスタマイズ
エンティティの broadcast notifications が broadcast される channel をカスタマイズしたい場合は、通知可能なエンティティにreceivesBroadcastNotificationsOn
method を定義することができます:
<?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 Notifications
Prerequisites
SMS の notifications を Laravel で送信する機能は、Vonage (旧称 Nexmo)によって提供されています。 Vonage を介して notifications を送信する前に、laravel/vonage-notification-channel
とguzzlehttp/guzzle
パッケージをインストールする必要があります:
composer require laravel/vonage-notification-channel guzzlehttp/guzzle
パッケージには設定ファイル が含まれています。しかし、この設定ファイルを自分の application にエクスポートすることは必須ではありません。単にVONAGE_KEY
とVONAGE_SECRET
の環境 variables を使用して、Vonage の公開 key と秘密 key を定義することができます。
keys を定義した後、SMS メッセージが default で送信されるべき電話番号を定義するVONAGE_SMS_FROM
environment variables を設定する必要があります。この電話番号は Vonage のコントロールパネル内で生成することができます。
VONAGE_SMS_FROM=15556666666
SMS Notifications のフォーマット設定
notification が SMS として送信できる場合、 notification class にtoVonage
method を定義する必要があります。この method は、$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
method を呼び出すべきです:
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
環境 variables で指定された電話番号とは異なる電話番号から通知を送りたい場合は、VonageMessage
インスタンスでfrom
method を呼び出すことができます:
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');
}
Client リファレンスの追加
もし user、チーム、または client ごとのコストを追跡したい場合は、notification に"client reference"を追加することができます。 Vonage は、この clientreference を使用してレポートを生成できるようになります。これにより、特定の顧客の SMS 使用状況をより理解することができます。 clientreference は、最大 40 文字までの任意の string にすることができます:
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');
}
Routing SMS Notifications
適切な電話番号に Vonage の通知を route するには、通知可能なエンティティにrouteNotificationForVonage
の method を定義します:
<?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 Notifications
Prerequisites
Slack notifications を送信する前に、 Composer 経由で Slack notification channel をインストールする必要があります:
composer require laravel/slack-notification-channel
さらに、あなたの Slack ワークスペース用のSlack App を作成する必要があります。
もし、作成した App と同じ Slack ワークスペースにのみ notifications を送る必要がある場合は、あなたの App がchat:write
、chat:write.public
、およびchat:write.customize
のスコープを持っていることを確認する必要があります。これらのスコープは、 Slack 内の"OAuth&Permissions" App 管理タブから追加できます。
次に、Bot User OAuth token をコピーし、それを application のservices.php
設定ファイル内のslack
設定 array に配置します。この token は、OAuth&Permissions タブ内の Slack で見つけることができます。
'slack' => [
'notifications' => [
'bot_user_oauth_token' => env('SLACK_BOT_USER_OAUTH_TOKEN'),
'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'),
],
],
App 配布
あなたの application が、application の users によって所有されている外部の Slack ワークスペースに notifications を送信する場合、あなたの App を Slack 経由で "distribute" する必要があります。App の配布は、Slack 内のアプリの"Manage Distribution" タブから管理できます。あなたの App が配布されたら、Socialite を使用して、application の users に代わって Slack Bot tokens を取得することができます。
フォーマット Slack Notifications
もし notification が Slack メッセージとして送信されることをサポートしている場合、toSlack
method を notification class 上で定義するべきです。この method は$notifiable
エンティティを受け取り、Illuminate\Notifications\Slack\SlackMessage
インスタンスを返すべきです。 Slack の Block Kit API を使ってリッチな notifications を構築することができます。次の例は、Slack's Block Kit builder で previews することができます。
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 の notification システムは、handle user interaction に強力な features を提供します。これらの features を利用するには、あなたの Slack App は"Interactivity"を有効にし、あなたの application によって提供される URL を指す"Request URL"を設定する必要があります。これらの設定は、Interactivity & Shortcuts の App 管理タブから Slack 内で管理することができます。
次の例では、actionsBlock
の method を活用して、Slack が request URL に対してPOST
の request を送信します。この request には、button をクリックした Slack user、クリックされた button の ID などが含まれるペイロードが含まれます。その後、あなたの application は、このペイロードに基づいて実行する action を決定できます。また、この request が 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');
});
}
確認モーダル
もし users に対して何かの action が実行される前に必ず確認を求めたい場合は、button を定義する際にconfirm
method を呼び出すことができます。confirm
method はメッセージと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
method を呼び出すことができます。dd
method は Slack の Block Kit Builder への URL を生成し、 dump します, これによりペイロードと notification のプレビューがブラウザで表示されます。 dd
method に true
を渡すことで、生のペイロードを dump することができます:
return (new SlackMessage)
->text('One of your invoices has been paid!')
->headerBlock('Invoice Paid')
->dd();
Routing Slack Notifications
Slack notifications を適切な Slack チームと channel に向けるために、 routeNotificationForSlack
method を通知可能な model 上に定義します。この method は 3 つの values のうちの 1 つを返すことができます。
null
- これは routing を、 notification 自体で設定された channel に委ねます。
SlackMessage
を構築する際にto
method を使用して、 notification 内の channel を設定することができます。
- これは routing を、 notification 自体で設定された channel に委ねます。
- notification を送るための Slack channel を指定する string 、例えば、
#support-channel
. - OAuth の token と channel の名前を指定できる
SlackRoute
インスタンス、例えばSlackRoute::make($this->slack_channel, $this->slack_token)
. この method は外部のワークスペースに notifications を送るために使用すべきです。
例えば、routeNotificationForSlack
の method から#support-channel
を返すと、アプリケーションのservices.php
設定ファイルに存在する Bot の User OAuth token に関連付けられたワークスペースの#support-channel
channel に notification が送信されます。
<?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 ワークスペースへの通知
NOTE
外部の Slack ワークスペースに notifications を送信する前に、あなたの Slack App は公開する必要があります。
もちろん、あなたはしばしばアプリケーションの users が所有する Slack ワークスペースに notifications を送りたいと思うでしょう。それを行うためには、まず user のための Slack OAuth token を取得する必要があります。ありがたいことに、Laravel Socialiteは Slack driver を含んでおり、アプリケーションの users を Slack で簡単に認証し、bot token を取得することができます。
ボットの token を入手し、それを application の database に保存したら、SlackRoute::make
method を使用して user のワークスペースに notification を route することができます。さらに、application は、user がどの channel notifications を送信すべきかを指定するための機会を提供する必要があるでしょう。
<?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);
}
}
Localizing Notifications
Laravel は、HTTP request の現在の locale とは異なる locale で通知を送ることができ、さらにその locale は、通知が queue に入っている場合でも記憶されます。
これを実現するために、Illuminate\Notifications\Notification
class は、希望する言語を設定するためのlocale
method を提供します。application は、通知が評価されている間、この locale に変更し、評価が完了したら前の locale に戻ります。
$user->notify((new InvoicePaid($invoice))->locale('es'));
Notification
の facade を通じて、複数の通知可能なエントリの Localization も達成できます:
Notification::locale('es')->send(
$users, new InvoicePaid($invoice)
);
User Preferred Locales
時折、アプリケーションは各ユーザーの好みの locale を保存します。HasLocalePreference
契約をあなたの通知可能な model に実装することで、 Laravel に対し、この保存された locale を notification を送信する際に使用するように指示することができます:
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 を使用して、 notifications と mailables を model に送信します。したがって、このインターフェースを使用するときに locale
method を呼び出す必要はありません:
$user->notify(new InvoicePaid($invoice));
Testing
Notification
facade のfake
method を使用して、通知の送信を防ぐことができます。通常、通知を送ることは、実際に testing しているコードとは無関係です。最も可能性が高いのは、単に Laravel が特定の通知を送信するよう指示されたことを assert するだけで十分であるということです。
Notification
ファサードのfake
method を呼び出した後、 notifications が users に送信するよう指示されたことを assert できます。さらに、 notifications が受け取った data をチェックすることも可能です:
<?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
methods にクロージャを渡すことで、特定の真理 test を通過した通知が送信されたことを"主張"できます。少なくとも 1 つの"通知"が指定された真理 test を通過していれば、その主張は成功します。
Notification::assertSentTo(
$user,
function (OrderShipped $notification, array $channels) use ($order) {
return $notification->order->id === $order->id;
}
);
オンデマンド Notifications
assertSentOnDemand
という method を使用して、オンデマンドの通知が送信されたことを確認できる場合、オンデマンドの通知を送信する testing を行うコードがある場合:
Notification::assertSentOnDemand(OrderShipped::class);
assertSentOnDemand
method の第二引数としてクロージャを渡すことで、オンデマンドの通知が正しい routes アドレスに送信されたかどうかを判断できます。
Notification::assertSentOnDemand(
OrderShipped::class,
function (OrderShipped $notification, array $channels, object $notifiable) use ($user) {
return $notifiable->routes['mail'] === $user->email;
}
);
Notification Events
Notification 送信 Event
通知が送信されるとき、Illuminate\Notifications\Events\NotificationSending
event が通知システムによって dispatch されます。これには、notifiable エンティティと通知インスタンス自体が含まれています。 application 内でこの event のためのevent listenersを作成することができます:
use Illuminate\Notifications\Events\NotificationSending;
class CheckNotificationStatus
{
/**
* Handle the given event.
*/
public function handle(NotificationSending $event): void
{
// ...
}
}
NotificationSending
event の listener がhandle
method からfalse
を返すと、 notification は event が送信されません。
/**
* Handle the given event.
*/
public function handle(NotificationSending $event): bool
{
return false;
}
event リスナー内では、notifiable
、notification
、およびchannel
プロパティを event でアクセスして、 notification の宛先や notification 自体について詳しく知ることができます。
/**
* Handle the given event.
*/
public function handle(NotificationSending $event): void
{
// $event->channel
// $event->notifiable
// $event->notification
}
Notification 送信 Event
notification が送信されると、Illuminate\Notifications\Events\NotificationSent
eventが notification システムによって発行されます。これには、notifiable エンティティと notification インスタンスそのものが含まれます。 application 内でこの event のためのevent listenersを作成することもできます:
use Illuminate\Notifications\Events\NotificationSent;
class LogNotification
{
/**
* Handle the given event.
*/
public function handle(NotificationSent $event): void
{
// ...
}
}
event listener 内では、notifiable
、notification
、channel
、およびresponse
プロパティを event 上でアクセスして、通知の受信者や通知自体について詳しく知ることができます。
/**
* Handle the given event.
*/
public function handle(NotificationSent $event): void
{
// $event->channel
// $event->notifiable
// $event->notification
// $event->response
}
Custom Channels
Laravel はいくつかの通知 channel を提供していますが、他の channel を経由して通知を配信するための独自の drivers を作成したいかもしれません。Laravel はそれを簡単にします。始めるには、send
という method を含む class を定義します。method は二つの引数、$notifiable
と$notification
を受け取るべきです。
send
method の中で、channel が理解するメッセージ object を取得するために通知の method を呼び出し、その後、好きなように通知を$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...
}
}
notification channel class が定義されたら、あなたのすべての notifications のvia
method から class 名を返すことができます。この例では、あなたの notification のtoVoice
method は、音声メッセージを表すために選んだ任意の object を返すことができます。例えば、これらのメッセージを表すために独自のVoiceMessage
class を定義することもできます:。
<?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;
/**
* Get the notification channels.
*/
public function via(object $notifiable): string
{
return VoiceChannel::class;
}
/**
* Get the voice representation of the notification.
*/
public function toVoice(object $notifiable): VoiceMessage
{
// ...
}
}