Lang x Lang

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 と、toMailtoDatabase のような、 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 は、maildatabasebroadcastvonageslackチャネルで送信することが可能です。

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 したい場合は、delaymethod を通知のインスタンス化にチェーンすることができます。

$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 インスタンスを戻すべきです。

MailMessageclass には、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->idtoMail 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 メーラーを使用して送信されます。ただし、メッセージの作成時にmailermethod を呼び出すことで、ランタイムで異なるメーラーを指定できます。

/**
 * 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 を、二つ目の引数としてarrayattach 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およびmetadatamethod を通じて、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

MailMessagewithSymfonyMessagemethod を使うことで、メッセージを送信する前に 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 を構築するためにlineactionメソッドを使用する代わりに、使用すべき 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 つの引数を受け入れます。サポートされている色はprimarygreenredです。 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 のそれぞれの表現を含む htmltext ディレクトリが含まれています。これらのコンポーネントは自由にカスタマイズすることができます。

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';
}

toDatabasetoArray

toArray method は、broadcast channel が JavaScript で動くフロントエンドに対してどの data を broadcast するべきかを決定するためにも使用されます。もし、databasebroadcast チャンネルのために二つの異なる 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 に入れたい場合は、BroadcastMessageonConnectionおよびonQueueメソッドを使用できます。

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

Notification Type のカスタマイズ

指定した data に加えて、すべての broadcast notifications には class の完全な名前を含む type フィールドもあります。 notification のtypeをカスタマイズしたい場合は、broadcastTypemethod を notification class に定義することができます。

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

Notifications の通知を待ち受ける

通知はプライベート channel 上で放送され、{notifiable}.{id}の規則で形式化されます。したがって、ID が1App\Models\Userインスタンスに通知を送信している場合、その通知はApp.Models.User.1のプライベート channel で放送されます。Laravel Echoを使用すると、channel 上の通知を簡単に監視することができます。notificationmethod を使用してください:

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-channelguzzlehttp/guzzleパッケージをインストールする必要があります:

composer require laravel/vonage-notification-channel guzzlehttp/guzzle

パッケージには設定ファイル が含まれています。しかし、この設定ファイルを自分の application にエクスポートすることは必須ではありません。単にVONAGE_KEYVONAGE_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インスタンスでfrommethod を呼び出すことができます:

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:writechat: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 を設定することができます。
  • 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 リスナー内では、notifiablenotification、および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 内では、notifiablenotificationchannel、および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
    {
        // ...
    }
}

当社サイトでは、Cookie を使用しています。各規約をご確認の上ご利用ください:
Cookie Policy, Privacy Policy および Terms of Use