Broadcastingを試してみます。Macのローカルで試してみます。id等で指定したいという感じです。素のSocket.ioではユーザーと通信の紐づけを自分で管理しないといけないのでLaravelのユーザー管理機能と連携したい。最初に知っておいた方がいいことPrivateChannelの配信先は認証済みユーザーであること個別配信(PrivateChannel)の利用はLaravelで認証済みのユーザーが前提のようです。最初、それを理解しておらずしばらくハマりました。middlewareが適用されており、API経由で利用(認証)するにはmiddlewareの変更等も必要です。SocketサーバはPusherとLaravel-Echo-Serverが利用できるその他も利用できますが、更新サンプルなどはPusherの利用前提で書かれていたりするので随時読み替えが必要です。Pusherを利用した記事はこちらをどうぞ。作るものconsoleに購読したチャネルの内容が表示されるだけのもの。準備まず、必要なものをインストールしておきます。Laravel何は無くてもLaravel。echo関連ライブラリ次に、ライブラリ群をインストールします。predis/predisRedisLaravel-Echo-Serverを利用する場合、Redisが必須となります。インストールがまだであれば、こちらを参考にインストールしてください。インストール後、redisを起動させておきます。redis-serverLaravel-Echo-ServerLaravel−Echo-Serverをインストールします。laravel-echo-serverインストールしたら設定(ファイルの定義)を行います。initコマンドで対話形式で設定できます。init今回は下記のような感じで返答しました。serverの位置(IPやポート)などは環境に応じて適切に設定してください。366fc3b105d867a3990b5b57xxxxxxxxなお、設定はlaravel-echo-server.jsonというファイルの記録されるようです。ソースの管理の都合上、Laravelのプロジェクトファイル内に保存したほうがいい感じです。設定が終わったら起動します。具体的な実装を行う前にLaravelの設定を行います。config/app.php(抜粋)config/app.phpの下記行がコメントアウトされているので、コメントインします。.....App\Providers\BroadcastServiceProvider::class,......env(抜粋)続いて.envの設定をします。BROADCAST_DRIVERをlogからredisに変更します。後々DBも利用するので、DBの設定も済ましておきましょう(migrateできるよう)。.....BROADCAST_DRIVER=redis.....実装1:Eventの追加(Channel:全員と通信する)まずは全体配信(通信)の機能を実装してみます。通信はEventを介して行われるので、Eventを作成します。PublicEventでは、ファイルを下記のようにします。やってることは、ShouldBroadcastをimplementspublic-eventというChannelを定義messageという名称でPUBLICという文字列を配信という感じ。}}Eventを発火させる機能を作ります。今回は特定のURLにアクセスしたら発火するようにしました。真っ白な画面になるので、いちおうpublicとだけ表示させておきます(無くてもいいです)。標準JS環境をVueからReactに変更する(必須ではない)私はReactを利用しるので、プリセット環境をVueからReactに切り替えておきます。続いてクライアント側機能の実装を行います。今回はブラウザのコンソールにメッセージを表示させるだけなので、resources/js/bootstrap.jsの最後に下記のコードを書きます。});ソースのコンパイルJSの記述が反映されるようコンパイルします。devwelcome.blade.phpメッセージの配信を確認するための記述をwelcome.blade.phpに対して行います。コンソールに出力するため、HTML等の編集はほとんどありませんが、JSを実行するために2つの記述を追加します。下記をheadのmetaタグに追加します。書きを</body>の手前にでも挿入しておきます。asset('js/app.js')}}"></script></body>動作確認では、Laravelを起動して動作を確認してみます。serve確認画面を開く/(webcome.blade.php)にアクセスして(Chromeの)デバッグコンソールを開きます。Eventの発火/public-eventにアクセスしてEventを発火させ、welcome.blade.phpのコンソールにPUBLICと表示されるのを確認します。実装2:Eventの追加(PrivateChannel:ユーザーを指定して通信する)続いて特定のユーザーに対して通信を行う方法(PrivateChannel)を利用してみます。Eventを作成します。PrivateEvent実装します。基本的にはPublicEventと同じですが、チャネルの指定をPrivateChannel()として行っているところが違います。メッセージとしてPRIVATEを送るようにします。}}routes/channel.phpなお、PrivateChannelでは、channel.phpにおいて認証?処理を行う必要があります。特定のchannelのパターン毎にロジックを定義します。trueかfalseをreturnするのですが、一旦全てOKというこで、trueを返しておきます。応用は後ほどやります。true;});ルートの追加PrivateEventを発火するためのルートを定義します。'private';});bootstrap.jsbootstrap.jsにPrivateChannelを処理するための記述を追加します。Echo.private()となります。Laravel-Echo-Serverのコンソールなお、この時点でブラウザを更新すると、クライアント側のjsがサーバにサブスクリプト(join)のための通信を行いますが認証エラーが出ているようです。PrivateChannelを利用するには(Laravel)の認証が必要なようです。"",上記はpublicへの参加はできてますが、privateへの参加が認証エラーとなっています。認証の準備では、認証機能を追加します。私のユースケースではAPI経由でのアクセスとなるのでAPI認証を行えるようにしてみます。migrateの準備usersテーブル用のマイグレーションファイルを下記のように編集します。api_tokenを追加してるだけです。}}migrateを実行します。migrate認証に利用するuserを1名追加しておきます(make:authで対応してもいいかと思います)。truehogehogeは単にAPI認証だけでなくUserの特定に利用されるのでUser毎に一意である必要があります。middlewareが適用されているようなのでAPIに変更します。app/Providers/BroadcastServiceProvider.phpを下記のように変更します。これによりBearerによるtoken認証が行われるようになります。}});クライアント側を更新するとエラーが消え、joinedとなりました。private-private-event実装3:改良するpublicもprivateも動くようになりましたが、ここまでの記述ではprivateも全員が同じchannelを購読しているため、PrivateChannelを利用しても全員に配信されてしまう実装になっています。やりたいことは、id=1の人にだけメッセージを送りたい。PrivateEventの発火元であるルートの記述を下記のように変更します。id=1のuserを取得し、PrivateEventにuserを渡します。'private';});続いてPrivateEvent.phpを変更します。渡されたuser情報を利用してuser専用のチャネルを設定します。}}チャネル名がprivate-event.user_idとなるように定義します。id=1の場合、チャネルはprivate-event.1となり、id=1の人しか購読しないチャネルとなる想定です。続いてchannel.phpのchannelのマッチングパターンを適切に変更します。channel()関数の第一引数には認証されたuser情報が入ります。その情報を利用して配信対象が適切であるかなどをチェックします。$id;});では、最後にクライアント側(js)を編集します。クライアント側でも購読するチャネルがprivate-event.user_idとなるよう実装します。Nativeと連携してみる以上です。requestStockLike28zaburo@zaburoこんにちは。自分用のメモをだらだら公開しています。upLoginユーザーは見つかりませんでした。