Laravel11 Sail+Reverbでのブロードキャスト機能開発環境の構築
Laravel Reverbが登場してbeyondcode/laravel-websockets
が終了。2022年の記事が古くなってたので書き直し。
あくまで開発環境までの話。本番環境で動かす話は含まない。
- 環境
- 新規プロジェクト作成
- Breezeインストール
- docker-compose.ymlでReverbも起動
- .envの変更
- Sail起動
- ReverbはWebSocketサーバー
- 新規ユーザーを作成
- PresenceChannel
- PrivateChannel
- 最後の動作確認
- 片付け
- 終わり
環境
- Laravel 11.x
- PHP 8.3
- Sail 1.x
- Breeze 2.x Inertia(Vue)
- Reverb 1.x
Horizonは開発環境では使いにくいのでなし。
将来のバージョンではこのまま真似しても動かない可能性が高いので注意。
新規プロジェクト作成
curl -s "https://laravel.build/sail-reverb-project" | bash
cd sail-reverb-project
Laravel11ではブロードキャスト機能はデフォルトでは無効なのでインストールして有効化。ここでReverbも一緒にインストールされる。
php artisan install:broadcasting
Breezeインストール
PrivateChannelやPresenceChannelも試したいのでスターターキットをインストール。今回はBreezeのVue版。好きなスターターキットを使えばいい。ReactならEchoを使うのでほとんど同じ。Livewireを使うのが最も簡単。
composer require laravel/breeze --dev
php artisan breeze:install vue
docker-compose.ymlでReverbも起動
reverb:
image: sail-8.3/app
ports:
- '${REVERB_PORT:-8080}:8080'
environment:
WWWUSER: '${WWWUSER}'
LARAVEL_SAIL: 1
volumes:
- '.:/var/www/html'
command: php artisan reverb:start --debug
restart: always
networks:
- sail
depends_on:
- mysql
- redis
.envの変更
Sailで起動するなら重要。
REVERB_HOSTはdocker-compose.yml
のサービス名と合わせる。
VITE_REVERB_HOSTはDockerの外から接続する用なのでlocalhost。
REVERB_HOST="reverb"
VITE_REVERB_HOST="localhost"
DB_HOST=mysql
と同様reverb
の名前で接続できる。内部ではLaravelのlaravel.test
からReverbのreverb:8080
にリクエストを送っている。REVERB_HOSTを変更してないとlaravel.test
からlocalhost:8080
に送ろうとしてエラーになる。
Sail起動
migrateしてviteのdevサーバー起動。
sail up -d
sail art migrate
sail npm run dev
Sail外でもいい。
npm run dev
ReverbはWebSocketサーバー
Pusherやbeyondcode/laravel-websockets
使ってた部分の代わりがReverb。前回の記事でのこの辺りの作業が全部不要になった。
新規ユーザーを作成
ここからはブロードキャスト機能の確認。
簡易的なのでチャットっぽいものを作るだけ。DBにログは残さずその場だけのチャット。
- PresenceChannel : ログイン中のユーザー共通のチャット。
- PrivateChannel : 自分だけのチャット。
前回の記事と同じなのでコピーして最新のInertiaで動くように修正しただけ。
PresenceChannel
長くなったのでコードはGitHubで。
処理の流れ
- DashboardのPresenceChannel.vueを表示したら
Echo.join('presence')
でPresenceChannelに参加。 - フォームからチャットを送信。
- Laravel側のPresenceController→PresenceSubmitイベントと進んでPresenceSubmitからブロードキャスト。
- フロント側に戻ってきて
.listen('PresenceSubmit',
で受信。
VueかReactで変わる表示部分は重要ではないのでこの流れを理解。
PrivateChannel
PresenceChannelとほとんど同じなのでファイルをコピーしてPrivateChannel用を作成。
最後の動作確認
2ユーザー作ってPresenceChannelには両方のチャットが表示、PrivateChannelには送信したユーザーだけ表示されることを確認。
片付け
終了時は
sail down
viteはCtrl+Cで終了。
終わり
ここまでできれば後はLaravelのドキュメントを見てブロードキャスト機能を使っていける。