マッチングシステムを作ろうとしています。一致が見つかったら、一致が見つかったユーザーにブロードキャストしたい。私はこれを理解できません - 代わりにポーリングを使用する必要がありますか?
私の User モデルには、Match モデルとの belongsToMany 関係があります。
動作しない私のコードを次に示します。
ルート:
Broadcast::channel('match.{matchId}', function ($user, $matchId) {
return $user->matches()->contains('id', $matchId);
});
成分:
class PlayComponent extends Component
{
public $matchId;
public function getListeners()
{
return [
"echo-private:match.{$this->matchId},JoinMatch" => 'joinMatch',
];
}
public function render()
{
return view('livewire.play-component', [
'matches' => Auth::user()->matches()->get()->toArray(),
]);
}
public function play()
{
if ($match = Match::where('status', 'waiting')->first()) {
$this->matchId = $match->id;
event(new JoinMatch($match));
}
else {
$this->matchId = Auth::user()->matches()->create(['status' => 'waiting']);
}
}
public function joinMatch()
{
// ???
}
}
意見:
<div>
<button class="btn btn-success" wire:click="play">Play</button>
<hr>
<pre>{{ print_r($matches, true) }}</pre>
</div>
イベント:
class JoinMatch implements ShouldBroadcast
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $match;
public function __construct(Match $match)
{
$this->match = $match;
$this->match->users()->attach(Auth::user()->id);
}
public function broadcastOn()
{
return new PrivateChannel('match.' . $this->match->id);
}
}
どうすればこれを機能させることができますか? 問題はパラメーターが必要だと思いgetListeners
ますが、このパラメーターは一致したユーザーにはまだ存在しない可能性があります。