Laravel Broadcasting, how to auth to a presence channel?

寵の児 提交于 2020-04-18 05:47:31

问题


I'm trying to join a presence channel (Public channels work well), but I can't get this to work:

Vue code:

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");
                });
    }

I'm trying to join the channel "game.0". As I'm using Laravel Passport I need to authenticate myself with a token, and that is working. Sending the auth request for Laravel Echo returns a key, but the JavaScript events are not triggering .here(), .listening() ....

BroadcastService provider boot function:

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];


});

The auth route:

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'));
});

Do I need to do something extra to make it work? This is the auth request:

EDIT: GameEvent event:

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;
    }

}

EDIT:

I've hardcoded the names: 'game.0' is now hardcoded in the routes/channels.php route, in the Echo connection and in the GameEvent. I also removed broadcastAs(). After entering the laravel-websockets debugging dashboard I found that the channel I want to subscribe doesn't even appear. It looks like it won't start a connection, but I can't figure out what it going on.

I hardcoded the


回答1:


The problem here seems to be that the Echo is not listening on proper channel. First of all the Echo.join is using channel game.0 in which 0 is a user's id, and i don't think that there is actually a user with id 0. Secondly, you are broadcasting as

GameEvent

and Echo is connecting to channel named game.{id} I suggest that you either remove the broadcastAs() function from your event file or listen on GameEvent. Also use the websocket dashboard for testing this. The dashboard will be available at

/laravel-websockets

route automatically, which is available only for local environment so make sure that environment is local in your .env.

Use the debugging dashboard provided by laravel-websockets to send data to channels, first connect to your web socket within the dashboard then just enter the channel name, event name and data in JSON format and hit send on the dashboard. Try finding out if that helps with resolving your problem.

I also recommend thoroughly reading laravel's official documentation on broadcasting as well as laravel-websockets debugging dashboard guide. Also update what you got in result to this question.



来源:https://stackoverflow.com/questions/61177471/laravel-broadcasting-how-to-auth-to-a-presence-channel

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!