Introduction

多くの現代のウェブアプリケーションでは、WebSocketを使用してリアルタイムでライブ更新されるユーザーインターフェースを実装しています。サーバー上のデータが更新されると、通常、WebSocket接続を介してクライアントが処理するためのメッセージが送信されます。WebSocketは、アプリケーションのサーバーに対してデータの変更を継続的にポーリングするよりも、より効率的な代替手段を提供します。

たとえば、アプリケーションがユーザーのデータをCSVファイルにエクスポートし、それをメールで送信できるとしましょう。しかし、このCSVファイルの作成には数分かかるため、キューに入れたジョブ内でCSVを作成してメールを送信することにします。CSVが作成され、ユーザーにメールが送信されると、イベントブロードキャスティングを使用して、アプリケーションのJavaScriptによって受信されるApp\Events\UserDataExportedイベントを送信できます。イベントが受信されると、ユーザーに対してCSVがメールで送信されたことを表示できます。ページをリフレッシュする必要はありません。

このような機能を構築するのを助けるために、LaravelはサーバーサイドのLaravel イベントをWebSocket接続を介して「ブロードキャスト」するのを簡単にします。Laravelイベントをブロードキャストすることで、サーバーサイドのLaravelアプリケーションとクライアントサイドのJavaScriptアプリケーションの間で同じイベント名とデータを共有できます。

ブロードキャスティングの基本概念はシンプルです:クライアントはフロントエンドの名前付きチャネルに接続し、Laravelアプリケーションはバックエンドでこれらのチャネルにイベントをブロードキャストします。これらのイベントには、フロントエンドで利用可能にしたい追加のデータを含めることができます。

Supported Drivers

デフォルトでは、Laravelには選択できる3つのサーバーサイドブロードキャスティングドライバーが含まれています:Laravel ReverbPusher Channels、およびAbly

イベントブロードキャスティングに入る前に、Laravelのイベントとリスナーに関するドキュメントを読んでおくことをお勧めします。

Server Side Installation

Laravelのイベントブロードキャスティングを使用するには、Laravelアプリケーション内でいくつかの設定を行い、いくつかのパッケージをインストールする必要があります。

イベントブロードキャスティングは、Laravelイベントをブロードキャストし、Laravel Echo(JavaScriptライブラリ)がブラウザクライアント内で受信できるようにするサーバーサイドブロードキャスティングドライバーによって実現されます。心配しないでください - インストールプロセスの各部分をステップバイステップで説明します。

Configuration

アプリケーションのすべてのイベントブロードキャスティング設定は、config/broadcasting.php設定ファイルに保存されます。このディレクトリがアプリケーションに存在しない場合でも心配しないでください。install:broadcasting Artisanコマンドを実行すると作成されます。

Laravelは、Laravel ReverbPusher ChannelsAbly、およびローカル開発とデバッグ用のlogドライバーなど、いくつかのブロードキャストドライバーを標準でサポートしています。さらに、テスト中にブロードキャストを無効にすることができるnullドライバーも含まれています。これらのドライバーの各設定例は、config/broadcasting.php設定ファイルに含まれています。

Installation

デフォルトでは、新しいLaravelアプリケーションではブロードキャスティングは有効になっていません。install:broadcasting Artisanコマンドを使用してブロードキャスティングを有効にできます:

  1. php artisan install:broadcasting
  1. <a name="queue-configuration"></a>
  2. #### Queue Configuration
  3. イベントをブロードキャストする前に、最初に[キュー作業者](/read/laravel-11-x/96fa7ac142293640.md)を設定して実行する必要があります。すべてのイベントブロードキャスティングはキューに入れられたジョブを介して行われるため、アプリケーションの応答時間がブロードキャストされるイベントによって深刻に影響を受けることはありません。
  4. <a name="reverb"></a>
  5. ### Reverb
  6. `````install:broadcasting`````コマンドを実行すると、[Laravel Reverb](/read/laravel-11-x/14372a38994562cc.md)をインストールするように求められます。もちろん、Composerパッケージマネージャーを使用して手動でReverbをインストールすることもできます。
  7. ``````sh
  8. composer require laravel/reverb
  9. `

パッケージがインストールされると、Reverbのインストールコマンドを実行して設定を公開し、Reverbの必要な環境変数を追加し、アプリケーションでイベントブロードキャスティングを有効にする準備が整います:

  1. php artisan reverb:install

詳細なReverbのインストールと使用に関する指示は、Reverbのドキュメントで確認できます。

Pusher Channels

イベントを Pusher Channelsを使用してブロードキャストする予定がある場合は、Composerパッケージマネージャーを使用してPusher Channels PHP SDKをインストールする必要があります:

  1. composer require pusher/pusher-php-server

次に、config/broadcasting.php設定ファイルでPusher Channelsの資格情報を設定する必要があります。このファイルには、キー、シークレット、およびアプリケーションIDをすぐに指定できるように、Pusher Channelsの設定例がすでに含まれています。通常、.envファイルでPusher Channelsの資格情報を設定する必要があります:

  1. PUSHER_APP_ID="your-pusher-app-id"
  2. PUSHER_APP_KEY="your-pusher-key"
  3. PUSHER_APP_SECRET="your-pusher-secret"
  4. PUSHER_HOST=
  5. PUSHER_PORT=443
  6. PUSHER_SCHEME="https"
  7. PUSHER_APP_CLUSTER="mt1"
  1. 次に、`````BROADCAST_CONNECTION`````環境変数を`````pusher`````に設定します。アプリケーションの`````.env`````ファイルで:
  2. ``````ini
  3. BROADCAST_CONNECTION=pusher
  4. `

最後に、クライアント側でブロードキャストイベントを受信するLaravel Echoをインストールして設定する準備が整いました。

Ably

以下のドキュメントでは、Ablyを「Pusher互換」モードで使用する方法について説明します。ただし、Ablyチームは、Ablyが提供するユニークな機能を活用できるブロードキャスターとEchoクライアントを推奨し、維持しています。Ablyが維持するドライバーの使用に関する詳細については、AblyのLaravelブロードキャスターのドキュメントを参照してください。

イベントをAblyを使用してブロードキャストする予定がある場合は、Composerパッケージマネージャーを使用してAbly PHP SDKをインストールする必要があります:

  1. composer require ably/ably-php

次に、config/broadcasting.php設定ファイルでAblyの資格情報を設定する必要があります。このファイルには、キーをすぐに指定できるように、Ablyの設定例がすでに含まれています。通常、この値はABLY_KEY 環境変数を介して設定する必要があります:

  1. ABLY_KEY=your-ably-key

次に、BROADCAST_CONNECTION環境変数をablyに設定します。アプリケーションの.envファイルで:

  1. BROADCAST_CONNECTION=ably

最後に、クライアント側でブロードキャストイベントを受信するLaravel Echoをインストールして設定する準備が整いました。

Client Side Installation

Reverb

Laravel Echoは、チャネルにサブスクライブし、サーバーサイドのブロードキャスティングドライバーによってブロードキャストされたイベントをリッスンするのを簡単にするJavaScriptライブラリです。EchoはNPMパッケージマネージャーを介してインストールできます。この例では、ReverbがWebSocketのサブスクリプション、チャネル、およびメッセージにPusherプロトコルを利用するため、pusher-jsパッケージもインストールします:

  1. npm install --save-dev laravel-echo pusher-js

Echoがインストールされると、アプリケーションのJavaScriptで新しいEchoインスタンスを作成する準備が整います。これを行うのに最適な場所は、Laravelフレームワークに含まれているresources/js/bootstrap.jsファイルの下部です。デフォルトでは、このファイルにはすでにEchoの設定例が含まれており、単にコメントを解除してbroadcaster設定オプションをreverbに更新する必要があります:

  1. import Echo from 'laravel-echo';
  2. import Pusher from 'pusher-js';
  3. window.Pusher = Pusher;
  4. window.Echo = new Echo({
  5. broadcaster: 'reverb',
  6. key: import.meta.env.VITE_REVERB_APP_KEY,
  7. wsHost: import.meta.env.VITE_REVERB_HOST,
  8. wsPort: import.meta.env.VITE_REVERB_PORT,
  9. wssPort: import.meta.env.VITE_REVERB_PORT,
  10. forceTLS: (import.meta.env.VITE_REVERB_SCHEME ?? 'https') === 'https',
  11. enabledTransports: ['ws', 'wss'],
  12. });

次に、アプリケーションのアセットをコンパイルする必要があります:

  1. npm run build

Laravel Echo reverbブロードキャスターは、laravel-echo v1.16.0+を必要とします。

Pusher Channels

Laravel Echoは、チャネルにサブスクライブし、サーバーサイドのブロードキャスティングドライバーによってブロードキャストされたイベントをリッスンするのを簡単にするJavaScriptライブラリです。Echoはまた、WebSocketのサブスクリプション、チャネル、およびメッセージのためにPusherプロトコルを実装するためにpusher-js NPMパッケージを活用します。

install:broadcasting Artisanコマンドは、laravel-echoおよびpusher-jsパッケージを自動的にインストールします。ただし、これらのパッケージをNPMを介して手動でインストールすることもできます:

  1. npm install --save-dev laravel-echo pusher-js

Echoがインストールされると、アプリケーションのJavaScriptで新しいEchoインスタンスを作成する準備が整います。install:broadcastingコマンドは、resources/js/echo.jsにEcho設定ファイルを作成します。ただし、このファイルのデフォルト設定はLaravel Reverb用に設計されています。以下の設定をコピーして、設定をPusherに移行できます:

  1. import Echo from 'laravel-echo';
  2. import Pusher from 'pusher-js';
  3. window.Pusher = Pusher;
  4. window.Echo = new Echo({
  5. broadcaster: 'pusher',
  6. key: import.meta.env.VITE_PUSHER_APP_KEY,
  7. cluster: import.meta.env.VITE_PUSHER_APP_CLUSTER,
  8. forceTLS: true
  9. });

次に、アプリケーションの.envファイルでPusher環境変数の適切な値を定義する必要があります。これらの変数が.envファイルにすでに存在しない場合は、追加する必要があります:

  1. PUSHER_APP_ID="your-pusher-app-id"
  2. PUSHER_APP_KEY="your-pusher-key"
  3. PUSHER_APP_SECRET="your-pusher-secret"
  4. PUSHER_HOST=
  5. PUSHER_PORT=443
  6. PUSHER_SCHEME="https"
  7. PUSHER_APP_CLUSTER="mt1"
  8. VITE_APP_NAME="${APP_NAME}"
  9. VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
  10. VITE_PUSHER_HOST="${PUSHER_HOST}"
  11. VITE_PUSHER_PORT="${PUSHER_PORT}"
  12. VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"
  13. VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

Echoの設定をアプリケーションのニーズに応じて調整したら、アプリケーションのアセットをコンパイルできます:

  1. npm run build

アプリケーションのJavaScriptアセットをコンパイルする方法の詳細については、Viteに関するドキュメントを参照してください。

Using an Existing Client Instance

すでに事前に設定されたPusher Channelsクライアントインスタンスがあり、Echoに利用させたい場合は、client設定オプションを介してそれをEchoに渡すことができます:

  1. import Echo from 'laravel-echo';
  2. import Pusher from 'pusher-js';
  3. const options = {
  4. broadcaster: 'pusher',
  5. key: 'your-pusher-channels-key'
  6. }
  7. window.Echo = new Echo({
  8. ...options,
  9. client: new Pusher(options.key, options)
  10. });

Ably

以下のドキュメントでは、Ablyを「Pusher互換」モードで使用する方法について説明します。ただし、Ablyチームは、Ablyが提供するユニークな機能を活用できるブロードキャスターとEchoクライアントを推奨し、維持しています。Ablyが維持するドライバーの使用に関する詳細については、AblyのLaravelブロードキャスターのドキュメントを参照してください。

Laravel Echoは、チャネルにサブスクライブし、サーバーサイドのブロードキャスティングドライバーによってブロードキャストされたイベントをリッスンするのを簡単にするJavaScriptライブラリです。Echoはまた、WebSocketのサブスクリプション、チャネル、およびメッセージのためにpusher-js NPMパッケージを活用します。

install:broadcasting Artisanコマンドは、laravel-echoおよびpusher-jsパッケージを自動的にインストールします。ただし、これらのパッケージをNPMを介して手動でインストールすることもできます:

  1. npm install --save-dev laravel-echo pusher-js

続行する前に、Ablyアプリケーション設定でPusherプロトコルサポートを有効にする必要があります。この機能は、Ablyアプリケーションの設定ダッシュボードの「プロトコルアダプタ設定」部分で有効にできます。

Echoがインストールされると、アプリケーションのJavaScriptで新しいEchoインスタンスを作成する準備が整います。install:broadcastingコマンドは、resources/js/echo.jsにEcho設定ファイルを作成します。ただし、このファイルのデフォルト設定はLaravel Reverb用に設計されています。以下の設定をコピーして、設定をAblyに移行できます:

  1. import Echo from 'laravel-echo';
  2. import Pusher from 'pusher-js';
  3. window.Pusher = Pusher;
  4. window.Echo = new Echo({
  5. broadcaster: 'pusher',
  6. key: import.meta.env.VITE_ABLY_PUBLIC_KEY,
  7. wsHost: 'realtime-pusher.ably.io',
  8. wsPort: 443,
  9. disableStats: true,
  10. encrypted: true,
  11. });

Ably Echo設定がVITE_ABLY_PUBLIC_KEY環境変数を参照していることに気付いたかもしれません。この変数の値は、Ablyの公開キーである必要があります。公開キーは、:文字の前にあるAblyキーの部分です。

設定を調整したら、アプリケーションのアセットをコンパイルできます:

  1. npm run dev

アプリケーションのJavaScriptアセットをコンパイルする方法の詳細については、Viteに関するドキュメントを参照してください。

Concept Overview

Laravelのイベントブロードキャスティングを使用すると、サーバーサイドのLaravelイベントをクライアントサイドのJavaScriptアプリケーションにブロードキャストできます。これは、WebSocketに対するドライバーベースのアプローチを使用します。現在、LaravelはPusher ChannelsおよびAblyドライバーを提供しています。イベントは、Laravel Echo JavaScriptパッケージを使用してクライアント側で簡単に消費できます。

イベントは「チャネル」を介してブロードキャストされ、これらは公開またはプライベートとして指定できます。アプリケーションの訪問者は、認証や承認なしに公開チャネルにサブスクライブできますが、プライベートチャネルにサブスクライブするには、ユーザーが認証され、チャネルでリッスンする権限が必要です。

Using an Example Application

イベントブロードキャスティングの各コンポーネントに入る前に、eコマースストアを例にして高レベルの概要を見てみましょう。

アプリケーションには、ユーザーが注文の配送状況を確認できるページがあると仮定しましょう。また、配送状況の更新がアプリケーションによって処理されるときにOrderShipmentStatusUpdatedイベントが発火すると仮定します:

  1. use App\Events\OrderShipmentStatusUpdated;
  2. OrderShipmentStatusUpdated::dispatch($order);

The ShouldBroadcast Interface

ユーザーが自分の注文の1つを表示しているとき、ステータスの更新を表示するためにページをリフレッシュする必要はありません。代わりに、作成されるときにアプリケーションに更新をブロードキャストしたいと考えています。したがって、OrderShipmentStatusUpdatedイベントにShouldBroadcastインターフェースをマークする必要があります。これにより、Laravelはイベントが発火したときにブロードキャストするよう指示します:

  1. <?php
  2. namespace App\Events;
  3. use App\Models\Order;
  4. use Illuminate\Broadcasting\Channel;
  5. use Illuminate\Broadcasting\InteractsWithSockets;
  6. use Illuminate\Broadcasting\PresenceChannel;
  7. use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
  8. use Illuminate\Queue\SerializesModels;
  9. class OrderShipmentStatusUpdated implements ShouldBroadcast
  10. {
  11. /**
  12. * The order instance.
  13. *
  14. * @var \App\Models\Order
  15. */
  16. public $order;
  17. }
  1. ``````php
  2. use Illuminate\Broadcasting\Channel;
  3. use Illuminate\Broadcasting\PrivateChannel;
  4. /**
  5. * Get the channel the event should broadcast on.
  6. */
  7. public function broadcastOn(): Channel
  8. {
  9. return new PrivateChannel('orders.'.$this->order->id);
  10. }
  11. `

イベントを複数のチャネルでブロードキャストしたい場合は、arrayを返すことができます:

  1. use Illuminate\Broadcasting\PrivateChannel;
  2. /**
  3. * Get the channels the event should broadcast on.
  4. *
  5. * @return array<int, \Illuminate\Broadcasting\Channel>
  6. */
  7. public function broadcastOn(): array
  8. {
  9. return [
  10. new PrivateChannel('orders.'.$this->order->id),
  11. // ...
  12. ];
  13. }

Authorizing Channels

ユーザーはプライベートチャネルでリッスンするために承認される必要があることを忘れないでください。チャネルの承認ルールは、アプリケーションのroutes/channels.phpファイルに定義できます。この例では、プライベートorders.1チャネルでリッスンしようとしているユーザーが実際に注文の作成者であることを確認する必要があります:

  1. use App\Models\Order;
  2. use App\Models\User;
  3. Broadcast::channel('orders.{orderId}', function (User $user, int $orderId) {
  4. return $user->id === Order::findOrNew($orderId)->user_id;
  5. });
  1. すべての承認コールバックは、現在認証されているユーザーを最初の引数として受け取り、追加のワイルドカードパラメータをその後の引数として受け取ります。この例では、`````{orderId}`````プレースホルダーを使用して、チャネル名の「ID」部分がワイルドカードであることを示しています。
  2. <a name="listening-for-event-broadcasts"></a>
  3. #### Listening for Event Broadcasts
  4. 次に、JavaScriptアプリケーションでイベントをリッスンするだけです。これを[Laravel Echo](#client-side-installation)を使用して行うことができます。最初に、`````private`````メソッドを使用してプライベートチャネルにサブスクライブします。次に、`````listen`````メソッドを使用して`````OrderShipmentStatusUpdated`````イベントをリッスンできます。デフォルトでは、イベントのすべての公開プロパティがブロードキャストイベントに含まれます:
  5. ``````js
  6. Echo.private(`orders.${orderId}`)
  7. .listen('OrderShipmentStatusUpdated', (e) => {
  8. console.log(e.order);
  9. });
  10. `

Defining Broadcast Events

Laravelに特定のイベントをブロードキャストする必要があることを通知するには、イベントクラスでIlluminate\Contracts\Broadcasting\ShouldBroadcastインターフェースを実装する必要があります。このインターフェースは、フレームワークによって生成されたすべてのイベントクラスにすでにインポートされているため、簡単にイベントに追加できます。

  1. ``````php
  2. <?php
  3. namespace App\Events;
  4. use App\Models\User;
  5. use Illuminate\Broadcasting\Channel;
  6. use Illuminate\Broadcasting\InteractsWithSockets;
  7. use Illuminate\Broadcasting\PresenceChannel;
  8. use Illuminate\Broadcasting\PrivateChannel;
  9. use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
  10. use Illuminate\Queue\SerializesModels;
  11. class ServerCreated implements ShouldBroadcast
  12. {
  13. use SerializesModels;
  14. /**
  15. * Create a new event instance.
  16. */
  17. public function __construct(
  18. public User $user,
  19. ) {}
  20. /**
  21. * Get the channels the event should broadcast on.
  22. *
  23. * @return array<int, \Illuminate\Broadcasting\Channel>
  24. */
  25. public function broadcastOn(): array
  26. {
  27. return [
  28. new PrivateChannel('user.'.$this->user->id),
  29. ];
  30. }
  31. }
  32. `
  1. <a name="broadcast-name"></a>
  2. ### Broadcast Name
  3. デフォルトでは、Laravelはイベントのクラス名を使用してイベントをブロードキャストします。ただし、イベントに`````broadcastAs`````メソッドを定義することで、ブロードキャスト名をカスタマイズできます:
  4. ``````php
  5. /**
  6. * The event's broadcast name.
  7. */
  8. public function broadcastAs(): string
  9. {
  10. return 'server.created';
  11. }
  12. `
  1. ``````php
  2. .listen('.server.created', function (e) {
  3. ....
  4. });
  5. `

Broadcast Data

イベントがブロードキャストされると、そのすべてのpublicプロパティが自動的にシリアル化され、イベントのペイロードとしてブロードキャストされます。これにより、JavaScriptアプリケーションからその公開データにアクセスできます。たとえば、イベントにEloquentモデルを含む単一の公開$userプロパティがある場合、イベントのブロードキャストペイロードは次のようになります:

  1. {
  2. "user": {
  3. "id": 1,
  4. "name": "Patrick Stewart"
  5. ...
  6. }
  7. }

ただし、ブロードキャストペイロードをより詳細に制御したい場合は、イベントにbroadcastWithメソッドを追加できます。このメソッドは、イベントペイロードとしてブロードキャストしたいデータの配列を返す必要があります:

  1. /**
  2. * Get the data to broadcast.
  3. *
  4. * @return array<string, mixed>
  5. */
  6. public function broadcastWith(): array
  7. {
  8. return ['id' => $this->user->id];
  9. }

Broadcast Queue

デフォルトでは、各ブロードキャストイベントは、queue.php設定ファイルで指定されたデフォルトキュー接続のデフォルトキューに配置されます。ブロードキャスターによって使用されるキュー接続と名前をカスタマイズするには、イベントクラスでconnectionおよびqueueプロパティを定義します:

  1. /**
  2. * The name of the queue connection to use when broadcasting the event.
  3. *
  4. * @var string
  5. */
  6. public $connection = 'redis';
  7. /**
  8. * The name of the queue on which to place the broadcasting job.
  9. *
  10. * @var string
  11. */
  12. public $queue = 'default';

または、イベントにbroadcastQueueメソッドを定義することでキュー名をカスタマイズできます:

  1. /**
  2. * The name of the queue on which to place the broadcasting job.
  3. */
  4. public function broadcastQueue(): string
  5. {
  6. return 'default';
  7. }

デフォルトのキュードライバーではなくsyncキューを使用してイベントをブロードキャストしたい場合は、ShouldBroadcastNowインターフェースを実装することができます。ShouldBroadcastの代わりに:

  1. <?php
  2. use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;
  3. class OrderShipmentStatusUpdated implements ShouldBroadcastNow
  4. {
  5. // ...
  6. }

Broadcast Conditions

特定の条件が真である場合にのみイベントをブロードキャストしたい場合があります。これらの条件を定義するには、イベントクラスにbroadcastWhenメソッドを追加します:

  1. /**
  2. * Determine if this event should broadcast.
  3. */
  4. public function broadcastWhen(): bool
  5. {
  6. return $this->order->value > 100;
  7. }

Broadcasting and Database Transactions

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

キュー接続のafter_commit設定オプションがfalseに設定されている場合でも、特定のブロードキャストイベントがすべてのオープンデータベーストランザクションがコミットされた後に送信されるべきであることを示すには、イベントクラスでShouldDispatchAfterCommitインターフェースを実装します:

  1. <?php
  2. namespace App\Events;
  3. use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
  4. use Illuminate\Contracts\Events\ShouldDispatchAfterCommit;
  5. use Illuminate\Queue\SerializesModels;
  6. class ServerCreated implements ShouldBroadcast, ShouldDispatchAfterCommit
  7. {
  8. use SerializesModels;
  9. }

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

Authorizing Channels

プライベートチャネルでは、現在認証されているユーザーが実際にチャネルでリッスンできることを承認する必要があります。これは、チャネル名を持つHTTPリクエストをLaravelアプリケーションに送信し、ユーザーがそのチャネルでリッスンできるかどうかをアプリケーションに判断させることで実現されます。Laravel Echoを使用する場合、プライベートチャネルへのサブスクリプションを承認するためのHTTPリクエストは自動的に行われます。

ブロードキャスティングが有効になっている場合、Laravelは自動的に/broadcasting/authルートを登録して承認リクエストを処理します。/broadcasting/authルートはwebミドルウェアグループ内に自動的に配置されます。

Defining Authorization Callbacks

次に、現在認証されているユーザーが特定のチャネルでリッスンできるかどうかを実際に判断するロジックを定義する必要があります。これは、routes/channels.php Artisanコマンドによって作成されたファイルで行います。このファイルでは、Broadcast::channelメソッドを使用してチャネル承認コールバックを登録できます:

  1. use App\Models\User;
  2. Broadcast::channel('orders.{orderId}', function (User $user, int $orderId) {
  3. return $user->id === Order::findOrNew($orderId)->user_id;
  4. });
  1. すべての承認コールバックは、現在認証されているユーザーを最初の引数として受け取り、追加のワイルドカードパラメータをその後の引数として受け取ります。この例では、`````{orderId}`````プレースホルダーを使用して、チャネル名の「ID」部分がワイルドカードであることを示しています。
  2. アプリケーションのブロードキャスト承認コールバックのリストは、`````channel:list````` Artisanコマンドを使用して表示できます:
  3. ``````shell
  4. php artisan channel:list
  5. `

Authorization Callback Model Binding

HTTPルートと同様に、チャネルルートも暗黙的および明示的なルートモデルバインディングを活用できます。たとえば、文字列や数値の注文IDを受け取る代わりに、実際のOrderモデルインスタンスを要求できます:

  1. use App\Models\Order;
  2. use App\Models\User;
  3. Broadcast::channel('orders.{order}', function (User $user, Order $order) {
  4. return $user->id === $order->user_id;
  5. });

HTTPルートモデルバインディングとは異なり、チャネルモデルバインディングは自動的な暗黙的モデルバインディングスコーピングをサポートしていません。ただし、ほとんどのチャネルは単一のモデルのユニークな主キーに基づいてスコープできるため、これはほとんど問題になりません。

Authorization Callback Authentication

プライベートおよびプレゼンスブロードキャストチャネルは、アプリケーションのデフォルトの認証ガードを介して現在のユーザーを認証します。ユーザーが認証されていない場合、チャネル承認は自動的に拒否され、承認コールバックは実行されません。ただし、必要に応じて、受信リクエストを認証するために複数のカスタムガードを割り当てることができます:

  1. Broadcast::channel('channel', function () {
  2. // ...
  3. }, ['guards' => ['web', 'admin']]);

Defining Channel Classes

アプリケーションが多くの異なるチャネルを消費している場合、routes/channels.phpファイルが大きくなる可能性があります。したがって、チャネルを承認するためにクロージャを使用する代わりに、チャネルクラスを使用できます。チャネルクラスを生成するには、make:channel Artisanコマンドを使用します。このコマンドは、App/Broadcastingディレクトリに新しいチャネルクラスを配置します。

  1. php artisan make:channel OrderChannel

次に、routes/channels.phpファイルでチャネルを登録します:

  1. use App\Broadcasting\OrderChannel;
  2. Broadcast::channel('orders.{order}', OrderChannel::class);

最後に、チャネルクラスのjoinメソッドにチャネルの承認ロジックを配置できます。このjoinメソッドには、通常チャネル承認クロージャに配置するロジックが含まれます。チャネルモデルバインディングを活用することもできます:

  1. <?php
  2. namespace App\Broadcasting;
  3. use App\Models\Order;
  4. use App\Models\User;
  5. class OrderChannel
  6. {
  7. /**
  8. * Create a new channel instance.
  9. */
  10. public function __construct() {}
  11. /**
  12. * Authenticate the user's access to the channel.
  13. */
  14. public function join(User $user, Order $order): array|bool
  15. {
  16. return $user->id === $order->user_id;
  17. }
  18. }

Laravelの他の多くのクラスと同様に、チャネルクラスはサービスコンテナによって自動的に解決されます。したがって、チャネルのコンストラクタで必要な依存関係を型ヒントすることができます。

Broadcasting Events

イベントを定義し、ShouldBroadcastインターフェースでマークしたら、イベントのdispatchメソッドを使用してイベントを発火するだけです。イベントディスパッチャは、イベントがShouldBroadcastインターフェースでマークされていることに気付き、ブロードキャストのためにイベントをキューに入れます:

  1. use App\Events\OrderShipmentStatusUpdated;
  2. OrderShipmentStatusUpdated::dispatch($order);

Only to Others

イベントブロードキャスティングを利用するアプリケーションを構築する際、特定のチャネルのすべてのサブスクライバーにイベントをブロードキャストする必要があるが、現在のユーザーにはブロードキャストしない必要がある場合があります。これをbroadcastヘルパーとtoOthersメソッドを使用して実現できます:

  1. use App\Events\OrderShipmentStatusUpdated;
  2. broadcast(new OrderShipmentStatusUpdated($update))->toOthers();

toOthersメソッドを使用する必要がある状況をよりよく理解するために、ユーザーがタスク名を入力して新しいタスクを作成できるタスクリストアプリケーションを想像してみましょう。タスクを作成するために、アプリケーションはタスクの作成をブロードキャストし、新しいタスクのJSON表現を返す/task URLにリクエストを行うかもしれません。JavaScriptアプリケーションがエンドポイントからの応答を受け取ると、新しいタスクをタスクリストに直接挿入するかもしれません:

  1. axios.post('/task', task)
  2. .then((response) => {
  3. this.tasks.push(response.data);
  4. });

ただし、タスクの作成もブロードキャストされることを忘れないでください。JavaScriptアプリケーションがこのイベントをリッスンしてタスクリストにタスクを追加する場合、リストに重複したタスクが表示されます:エンドポイントからの1つとブロードキャストからの1つです。toOthersメソッドを使用して、ブロードキャスターに現在のユーザーにイベントをブロードキャストしないよう指示できます。

イベントはIlluminate\Broadcasting\InteractsWithSocketsトレイトを使用する必要があります。toOthersメソッドを呼び出すために。

Configuration

Laravel Echoインスタンスを初期化すると、接続にソケットIDが割り当てられます。JavaScriptアプリケーションからHTTPリクエストを行うためにグローバルAxiosインスタンスを使用している場合、ソケットIDは自動的にすべての送信リクエストにX-Socket-IDヘッダーとして添付されます。次に、toOthersメソッドを呼び出すと、LaravelはヘッダーからソケットIDを抽出し、ブロードキャスターにそのソケットIDを持つ接続にブロードキャストしないよう指示します。

グローバルAxiosインスタンスを使用していない場合は、すべての送信リクエストにX-Socket-IDヘッダーを送信するようにJavaScriptアプリケーションを手動で構成する必要があります。Echo.socketIdメソッドを使用してソケットIDを取得できます:

  1. var socketId = Echo.socketId();

Customizing the Connection

アプリケーションが複数のブロードキャスト接続と対話し、デフォルト以外のブロードキャスターを使用してイベントをブロードキャストしたい場合は、viaメソッドを使用してイベントをプッシュする接続を指定できます:

  1. use App\Events\OrderShipmentStatusUpdated;
  2. broadcast(new OrderShipmentStatusUpdated($update))->via('pusher');

または、イベントのコンストラクタ内でbroadcastViaメソッドを呼び出すことで、イベントのブロードキャスト接続を指定できます。ただし、その前に、イベントクラスがInteractsWithBroadcastingトレイトを使用していることを確認する必要があります:

  1. <?php
  2. namespace App\Events;
  3. use Illuminate\Broadcasting\Channel;
  4. use Illuminate\Broadcasting\InteractsWithBroadcasting;
  5. use Illuminate\Broadcasting\InteractsWithSockets;
  6. use Illuminate\Broadcasting\PresenceChannel;
  7. use Illuminate\Broadcasting\PrivateChannel;
  8. use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
  9. use Illuminate\Queue\SerializesModels;
  10. class OrderShipmentStatusUpdated implements ShouldBroadcast
  11. {
  12. use InteractsWithBroadcasting;
  13. /**
  14. * Create a new event instance.
  15. */
  16. public function __construct()
  17. {
  18. $this->broadcastVia('pusher');
  19. }
  20. }

Anonymous Events

時には、専用のイベントクラスを作成せずに、アプリケーションのフロントエンドにシンプルなイベントをブロードキャストしたい場合があります。これに対応するために、Broadcastファサードを使用して「匿名イベント」をブロードキャストできます:

  1. Broadcast::on('orders.'.$order->id)->send();

上記の例では、次のイベントがブロードキャストされます:

  1. {
  2. "event": "AnonymousEvent",
  3. "data": "[]",
  4. "channel": "orders.1"
  5. }
  1. ``````php
  2. Broadcast::on('orders.'.$order->id)
  3. ->as('OrderPlaced')
  4. ->with($order)
  5. ->send();
  6. `

上記の例では、次のようなイベントがブロードキャストされます:

  1. {
  2. "event": "OrderPlaced",
  3. "data": "{ id: 1, total: 100 }",
  4. "channel": "orders.1"
  5. }

匿名イベントをプライベートまたはプレゼンスチャネルでブロードキャストしたい場合は、privateおよびpresenceメソッドを利用できます:

  1. Broadcast::private('orders.'.$order->id)->send();
  2. Broadcast::presence('channels.'.$channel->id)->send();
  1. ``````php
  2. Broadcast::on('orders.'.$order->id)->sendNow();
  3. `

現在認証されているユーザーを除くすべてのチャネルサブスクライバーにイベントをブロードキャストするには、toOthersメソッドを呼び出すことができます:

  1. Broadcast::on('orders.'.$order->id)
  2. ->toOthers()
  3. ->send();

Receiving Broadcasts

イベントのリスニング

一度 Laravel Echo をインストールしてインスタンス化 すると、Laravel アプリケーションからブロードキャストされるイベントをリッスンする準備が整います。まず、channel メソッドを使用してチャネルのインスタンスを取得し、次に listen メソッドを呼び出して指定されたイベントをリッスンします:

  1. Echo.channel(`orders.${this.order.id}`)
  2. .listen('OrderShipmentStatusUpdated', (e) => {
  3. console.log(e.order.name);
  4. });

プライベートチャネルでイベントをリッスンしたい場合は、private メソッドを代わりに使用します。listen メソッドへの呼び出しをチェーンして、単一のチャネルで複数のイベントをリッスンし続けることができます:

  1. Echo.private(`orders.${this.order.id}`)
  2. .listen(/* ... */)
  3. .listen(/* ... */)
  4. .listen(/* ... */);

イベントのリスニングを停止する

特定のイベントのリスニングを停止したい場合は、チャネルを離れずに stopListening メソッドを使用できます:

  1. Echo.private(`orders.${this.order.id}`)
  2. .stopListening('OrderShipmentStatusUpdated')

チャネルを離れる

チャネルを離れるには、Echo インスタンスで leaveChannel メソッドを呼び出します:

  1. Echo.leaveChannel(`orders.${this.order.id}`);

チャネルとその関連するプライベートおよびプレゼンスチャネルを離れたい場合は、leave メソッドを呼び出します:

  1. Echo.leave(`orders.${this.order.id}`);

ネームスペース

上記の例で、イベントクラスの完全な App\Events ネームスペースを指定しなかったことに気づいたかもしれません。これは、Echo が自動的にイベントが App\Events ネームスペースにあると仮定するためです。ただし、Echo をインスタンス化する際に namespace 設定オプションを渡すことで、ルートネームスペースを構成できます:

  1. window.Echo = new Echo({
  2. broadcaster: 'pusher',
  3. // ...
  4. namespace: 'App.Other.Namespace'
  5. });

また、Echo を使用してサブスクライブする際に、イベントクラスに . をプレフィックスすることもできます。これにより、常に完全修飾クラス名を指定できます:

  1. Echo.channel('orders')
  2. .listen('.Namespace\\Event\\Class', (e) => {
  3. // ...
  4. });

プレゼンスチャネル

プレゼンスチャネルは、プライベートチャネルのセキュリティを基盤に構築され、チャネルにサブスクライブしているユーザーを認識する追加機能を提供します。これにより、他のユーザーが同じページを表示しているときに通知したり、チャットルームの住人をリストアップしたりするなど、強力で協力的なアプリケーション機能を簡単に構築できます。

プレゼンスチャネルの認可

すべてのプレゼンスチャネルはプライベートチャネルでもあるため、ユーザーは アクセスを認可される必要があります。ただし、プレゼンスチャネルの認可コールバックを定義する際、ユーザーがチャネルに参加するために認可されている場合は true を返さないでください。代わりに、ユーザーに関するデータの配列を返す必要があります。

認可コールバックによって返されたデータは、JavaScript アプリケーション内のプレゼンスチャネルイベントリスナーで利用可能になります。ユーザーがプレゼンスチャネルに参加するために認可されていない場合は、false または null を返す必要があります:

  1. use App\Models\User;
  2. Broadcast::channel('chat.{roomId}', function (User $user, int $roomId) {
  3. if ($user->canJoinRoom($roomId)) {
  4. return ['id' => $user->id, 'name' => $user->name];
  5. }
  6. });

プレゼンスチャネルに参加する

プレゼンスチャネルに参加するには、Echo の join メソッドを使用します。join メソッドは PresenceChannel 実装を返し、listen メソッドを公開することで、herejoining、および leaving イベントにサブスクライブできます。

  1. Echo.join(`chat.${roomId}`)
  2. .here((users) => {
  3. // ...
  4. })
  5. .joining((user) => {
  6. console.log(user.name);
  7. })
  8. .leaving((user) => {
  9. console.log(user.name);
  10. })
  11. .error((error) => {
  12. console.error(error);
  13. });

チャネルに正常に参加すると、here コールバックが即座に実行され、現在チャネルにサブスクライブしている他のすべてのユーザーのユーザー情報を含む配列を受け取ります。新しいユーザーがチャネルに参加すると joining メソッドが実行され、ユーザーがチャネルを離れると leaving メソッドが実行されます。認証エンドポイントが 200 以外の HTTP ステータスコードを返すか、返された JSON の解析に問題がある場合は error メソッドが実行されます。

プレゼンスチャネルへのブロードキャスト

プレゼンスチャネルは、パブリックまたはプライベートチャネルと同様にイベントを受信できます。チャットルームの例を使用すると、ルームのプレゼンスチャネルに NewMessage イベントをブロードキャストしたい場合があります。そのためには、イベントの broadcastOn メソッドから PresenceChannel のインスタンスを返します:

  1. /**
  2. * Get the channels the event should broadcast on.
  3. *
  4. * @return array<int, \Illuminate\Broadcasting\Channel>
  5. */
  6. public function broadcastOn(): array
  7. {
  8. return [
  9. new PresenceChannel('chat.'.$this->message->room_id),
  10. ];
  11. }

他のイベントと同様に、broadcast ヘルパーと toOthers メソッドを使用して、現在のユーザーがブロードキャストを受信しないように除外できます:

  1. broadcast(new NewMessage($message));
  2. broadcast(new NewMessage($message))->toOthers();

他のタイプのイベントと同様に、Echo の listen メソッドを使用してプレゼンスチャネルに送信されたイベントをリッスンできます:

  1. Echo.join(`chat.${roomId}`)
  2. .here(/* ... */)
  3. .joining(/* ... */)
  4. .leaving(/* ... */)
  5. .listen('NewMessage', (e) => {
  6. // ...
  7. });

モデルブロードキャスティング

モデルブロードキャスティングに関する以下のドキュメントを読む前に、Laravel のモデルブロードキャスティングサービスの一般的な概念や、ブロードキャストイベントを手動で作成してリッスンする方法に慣れておくことをお勧めします。

アプリケーションの Eloquent モデル が作成、更新、または削除されるときにイベントをブロードキャストすることは一般的です。もちろん、これは手動で Eloquent モデルの状態変更のためのカスタムイベントを定義する ことによって簡単に達成でき、ShouldBroadcast インターフェースでそれらのイベントにマークを付けることができます。

ただし、アプリケーション内でこれらのイベントを他の目的で使用していない場合、ブロードキャストするためだけにイベントクラスを作成するのは面倒です。これを解決するために、Laravel は Eloquent モデルが自動的に状態変更をブロードキャストするべきであることを示すことを許可します。

始めるには、Eloquent モデルは Illuminate\Database\Eloquent\BroadcastsEvents トレイトを使用する必要があります。さらに、モデルは broadcastOn メソッドを定義する必要があり、これはモデルのイベントがブロードキャストされるチャネルの配列を返します:

  1. <?php
  2. namespace App\Models;
  3. use Illuminate\Broadcasting\Channel;
  4. use Illuminate\Broadcasting\PrivateChannel;
  5. use Illuminate\Database\Eloquent\BroadcastsEvents;
  6. use Illuminate\Database\Eloquent\Factories\HasFactory;
  7. use Illuminate\Database\Eloquent\Model;
  8. use Illuminate\Database\Eloquent\Relations\BelongsTo;
  9. class Post extends Model
  10. {
  11. use BroadcastsEvents, HasFactory;
  12. /**
  13. * Get the user that the post belongs to.
  14. */
  15. public function user(): BelongsTo
  16. {
  17. return $this->belongsTo(User::class);
  18. }
  19. /**
  20. * Get the channels that model events should broadcast on.
  21. *
  22. * @return array<int, \Illuminate\Broadcasting\Channel|\Illuminate\Database\Eloquent\Model>
  23. */
  24. public function broadcastOn(string $event): array
  25. {
  26. return [$this, $this->user];
  27. }
  28. }

モデルがこのトレイトを含み、ブロードキャストチャネルを定義すると、モデルインスタンスが作成、更新、削除、廃棄、または復元されるときに自動的にイベントがブロードキャストされ始めます。

さらに、broadcastOn メソッドが文字列 $event 引数を受け取ることに気づいたかもしれません。この引数は、モデルで発生したイベントのタイプを含み、createdupdateddeletedtrashed、または restored の値を持ちます。この変数の値を調べることで、特定のイベントに対してモデルがどのチャネルにブロードキャストすべきかを判断できます:

  1. /**
  2. * Get the channels that model events should broadcast on.
  3. *
  4. * @return array<string, array<int, \Illuminate\Broadcasting\Channel|\Illuminate\Database\Eloquent\Model>>
  5. */
  6. public function broadcastOn(string $event): array
  7. {
  8. return match ($event) {
  9. 'deleted' => [],
  10. default => [$this, $this->user],
  11. };
  12. }

モデルブロードキャスティングイベントの作成のカスタマイズ

時折、Laravel が基盤となるモデルブロードキャスティングイベントを作成する方法をカスタマイズしたい場合があります。これを達成するには、Eloquent モデルに newBroadcastableEvent メソッドを定義します。このメソッドは Illuminate\Database\Eloquent\BroadcastableModelEventOccurred インスタンスを返す必要があります:

  1. use Illuminate\Database\Eloquent\BroadcastableModelEventOccurred;
  2. /**
  3. * Create a new broadcastable model event for the model.
  4. */
  5. protected function newBroadcastableEvent(string $event): BroadcastableModelEventOccurred
  6. {
  7. return (new BroadcastableModelEventOccurred(
  8. $this, $event
  9. ))->dontBroadcastToCurrentUser();
  10. }

モデルブロードキャスティングの慣習

チャネルの慣習

上記のモデル例で broadcastOn メソッドが Channel インスタンスを返さなかったことに気づいたかもしれません。代わりに、Eloquent モデルが直接返されました。Eloquent モデルインスタンスがモデルの broadcastOn メソッドによって返される場合(またはメソッドによって返される配列に含まれる場合)、Laravel はモデルのクラス名と主キー識別子をチャネル名として使用して、モデルのプライベートチャネルインスタンスを自動的にインスタンス化します。

したがって、App\Models\User モデルの id1 の場合、Illuminate\Broadcasting\PrivateChannel インスタンスは App.Models.User.1 という名前に変換されます。もちろん、モデルの broadcastOn メソッドから Eloquent モデルインスタンスを返すだけでなく、モデルのチャネル名を完全に制御するために完全な Channel インスタンスを返すこともできます:

  1. use Illuminate\Broadcasting\PrivateChannel;
  2. /**
  3. * Get the channels that model events should broadcast on.
  4. *
  5. * @return array<int, \Illuminate\Broadcasting\Channel>
  6. */
  7. public function broadcastOn(string $event): array
  8. {
  9. return [
  10. new PrivateChannel('user.'.$this->id)
  11. ];
  12. }

モデルの broadcastOn メソッドからチャネルインスタンスを明示的に返す予定がある場合、Eloquent モデルインスタンスをチャネルのコンストラクタに渡すことができます。その際、Laravel は上記で説明したモデルチャネルの慣習を使用して、Eloquent モデルをチャネル名の文字列に変換します:

  1. return [new Channel($this->user)];

モデルのチャネル名を決定する必要がある場合は、任意のモデルインスタンスで broadcastChannel メソッドを呼び出すことができます。たとえば、このメソッドは 1App\Models\User モデルに対して App.Models.User.1 という文字列を返します:

  1. $user->broadcastChannel()

イベントの慣習

モデルブロードキャストイベントは、アプリケーションの App\Events ディレクトリ内の「実際の」イベントに関連付けられていないため、慣習に基づいて名前とペイロードが割り当てられます。Laravel の慣習は、モデルのクラス名(ネームスペースを含まない)とブロードキャストをトリガーしたモデルイベントの名前を使用してイベントをブロードキャストすることです。

たとえば、App\Models\Post モデルの更新は、PostUpdated としてクライアント側アプリケーションにイベントをブロードキャストし、次のペイロードを持ちます:

  1. {
  2. "model": {
  3. "id": 1,
  4. "title": "My first post"
  5. ...
  6. },
  7. ...
  8. "socket": "someSocketId",
  9. }

App\Models\User モデルの削除は、UserDeleted という名前のイベントをブロードキャストします。

必要に応じて、モデルに broadcastAs および broadcastWith メソッドを追加することで、カスタムブロードキャスト名とペイロードを定義できます。これらのメソッドは、発生しているモデルイベント/操作の名前を受け取り、各モデル操作のイベントの名前とペイロードをカスタマイズできます。nullbroadcastAs メソッドから返されると、Laravel は上記で説明したモデルブロードキャスティングイベント名の慣習を使用してイベントをブロードキャストします:

  1. /**
  2. * The model event's broadcast name.
  3. */
  4. public function broadcastAs(string $event): string|null
  5. {
  6. return match ($event) {
  7. 'created' => 'post.created',
  8. default => null,
  9. };
  10. }
  11. /**
  12. * Get the data to broadcast for the model.
  13. *
  14. * @return array<string, mixed>
  15. */
  16. public function broadcastWith(string $event): array
  17. {
  18. return match ($event) {
  19. 'created' => ['title' => $this->title],
  20. default => ['model' => $this],
  21. };
  22. }

モデルブロードキャストのリスニング

モデルに BroadcastsEvents トレイトを追加し、モデルの broadcastOn メソッドを定義すると、クライアント側アプリケーション内でブロードキャストされたモデルイベントをリッスンする準備が整います。始める前に、イベントのリスニング に関する完全なドキュメントを参照することをお勧めします。

まず、private メソッドを使用してチャネルのインスタンスを取得し、次に listen メソッドを呼び出して指定されたイベントをリッスンします。通常、private メソッドに与えられるチャネル名は、Laravel の モデルブロードキャスティングの慣習 に対応する必要があります。

チャネルインスタンスを取得したら、listen メソッドを使用して特定のイベントをリッスンできます。モデルブロードキャストイベントは、アプリケーションの App\Events ディレクトリ内の「実際の」イベントに関連付けられていないため、イベント名 は特定のネームスペースに属さないことを示すために . でプレフィックスする必要があります。各モデルブロードキャストイベントには、モデルのブロードキャスト可能なプロパティを含む model プロパティがあります:

  1. Echo.private(`App.Models.User.${this.user.id}`)
  2. .listen('.PostUpdated', (e) => {
  3. console.log(e.model);
  4. });

クライアントイベント

Pusher Channels を使用する場合、クライアントイベントを送信するために、アプリケーションダッシュボード の「アプリ設定」セクションで「クライアントイベント」オプションを有効にする必要があります。

時には、Laravel アプリケーションに全くヒットせずに、他の接続されたクライアントにイベントをブロードキャストしたい場合があります。これは、他のユーザーが特定の画面でメッセージを入力していることをアプリケーションのユーザーに通知したい「入力中」通知などに特に便利です。

クライアントイベントをブロードキャストするには、Echo の whisper メソッドを使用します:

  1. Echo.private(`chat.${roomId}`)
  2. .whisper('typing', {
  3. name: this.user.name
  4. });

クライアントイベントをリッスンするには、listenForWhisper メソッドを使用します:

  1. Echo.private(`chat.${roomId}`)
  2. .listenForWhisper('typing', (e) => {
  3. console.log(e.name);
  4. });

通知

イベントブロードキャスティングと 通知 を組み合わせることで、JavaScript アプリケーションはページをリフレッシュすることなく、新しい通知を受け取ることができます。始める前に、ブロードキャスト通知チャネル の使用に関するドキュメントを必ず確認してください。

通知をブロードキャストチャネルを使用するように構成したら、Echo の notification メソッドを使用してブロードキャストイベントをリッスンできます。チャネル名は、通知を受け取るエンティティのクラス名と一致する必要があります:

  1. Echo.private(`App.Models.User.${userId}`)
  2. .notification((notification) => {
  3. console.log(notification.type);
  4. });

この例では、App\Models\User インスタンスに broadcast チャネルを介して送信されたすべての通知がコールバックによって受信されます。App.Models.User.{id} チャネルのチャネル認可コールバックは、アプリケーションの routes/channels.php ファイルに含まれています。