Laravel Broadcasting,如何验证在线状态频道?

时间:2020-04-12 20:09:02

标签: php laravel websocket laravel-echo

我正在尝试加入一个在线频道(公共频道运行良好),但我无法使它正常工作

Vue 代码:

mounted(){
        Echo.join('game.' + "0").here((users) => {
                alert("In the channel!");
            })
            .joining((user) => {
                console.log("Someone entered");
            })
            .leaving((user) => {
                console.log(user.name);
            })
            .listen('GameEvent', (e) => {
                console.log("Hey")
            });

            Echo.channel('NewSentence')
                .listen('NewSentence',(sentence)=>{
                    alert("HOLA");
                });
    }

我正在尝试加入频道“ game.0”。当我使用Laravel Passport时,我需要使用令牌对自己进行身份验证,并且该方法可以正常工作。发送对Laravel Echo的身份验证请求会返回一个密钥,但是JavaScript事件未触发.here().listening()...。

BroadcastService提供程序启动功能:

public function boot() {
        Broadcast::routes(["middleware" => "auth:api"]);
        require base_path('routes/channels.php');
    }

channels.php

Broadcast::channel('game.0', function ($user,$id) {
   return ['id' => $user->id];


});

身份验证路由:

Route::post('/broadcasting/auth', function(Request $request){
$pusher = new Pusher\Pusher(
    env('PUSHER_APP_KEY'),
    env('PUSHER_APP_SECRET'),
    env('PUSHER_APP_ID'),
    array(
        'cluster' => env('PUSHER_APP_CLUSTER'),
        'useTLS' => false,
        'host' => '127.0.0.1',
        'port' => 6001,
        'scheme' => 'http',
    )
);

return $pusher->socket_auth($request->request->get('channel_name'),$request->request->get('socket_id'));
});

我需要做一些额外的事情才能使其正常工作吗?这是身份验证请求:

enter image description here

enter image description here

编辑: GameEvent 事件:

class GameEvent implements ShouldBroadcastNow {
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $gameEvent;
    public $gameId;
    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct($gameEvent, $gameId) {
        //
        $this->gameEvent = $gameEvent;
        $this->gameId = $gameId;
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\PresenceChannel|array
     */
    public function broadcastOn() {
        //return new PrivateChannel('channel-name');
        return new PresenceChannel('game.0');
    }

    public function broadcastWith() {
        return $this->gameEvent;
    }

}

编辑:

我已经硬编码了名称:'game.0'现在已经在routes/channels.php路由,Echo连接和GameEvent中进行了硬编码。我还删除了broadcastAs()。进入laravel-websockets调试仪表板后,我发现我要订阅的频道甚至没有出现。看来它不会启动连接,但是我不知道它是怎么回事。

我对

进行了硬编码

1 个答案:

答案 0 :(得分:0)

这里的问题似乎是回声未在正确的频道上收听。首先,Echo.join使用的是channel game.0,其中0是用户的ID,我不认为实际上有一个ID为0的用户。其次,您正在广播

GameEvent

并且Echo正在连接到名为游戏的频道。{id} 。我建议您从事件文件中删除 broadcastAs()函数或在上收听GameEvent 。还可以使用websocket仪表板对此进行测试。仪表板将位于

/ laravel-websockets

自动路由,仅适用于本地环境,因此请确保环境在您的.env中是本地的。

使用laravel-websockets提供的调试仪表板将数据发送到通道,首先连接到仪表板内的Web套接字,然后只需以JSON格式输入通道名称,事件名称和数据,然后在仪表板上点击send。 Laravel Websockets Dashboard Image 尝试找出是否有助于解决您的问题。

我还建议您全面阅读laravel's official documentation on broadcastinglaravel-websockets debugging dashboard guide。 同时更新您对这个问题得出的结果。