1

マッチングシステムを作ろうとしています。一致が見つかったら、一致が見つかったユーザーにブロードキャストしたい。私はこれを理解できません - 代わりにポーリングを使用する必要がありますか?

私の 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ますが、このパラメーターは一致したユーザーにはまだ存在しない可能性があります。

4

0 に答える 0