websocket Laravel Broadcasting,如何授权到一个呈现频道?

dfuffjeb  于 2024-01-09  发布在  其他
关注(0)|答案(2)|浏览(316)

我正在尝试加入一个在线状态频道(公共频道工作得很好),但我无法让它工作:

Vue代码:

  1. mounted(){
  2. Echo.join('game.' + "0").here((users) => {
  3. alert("In the channel!");
  4. })
  5. .joining((user) => {
  6. console.log("Someone entered");
  7. })
  8. .leaving((user) => {
  9. console.log(user.name);
  10. })
  11. .listen('GameEvent', (e) => {
  12. console.log("Hey")
  13. });
  14. Echo.channel('NewSentence')
  15. .listen('NewSentence',(sentence)=>{
  16. alert("HOLA");
  17. });
  18. }

字符串
我正在尝试加入通道“game.0”。由于我使用Laravel Passport,我需要使用令牌进行身份验证,并且正在工作。发送Laravel Echo的auth请求返回一个密钥,但JavaScript事件未触发.here().listening()..

BroadcastService提供商 Boot 功能:

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

channel.php

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

验证路径:

  1. Route::post('/broadcasting/auth', function(Request $request){
  2. $pusher = new Pusher\Pusher(
  3. env('PUSHER_APP_KEY'),
  4. env('PUSHER_APP_SECRET'),
  5. env('PUSHER_APP_ID'),
  6. array(
  7. 'cluster' => env('PUSHER_APP_CLUSTER'),
  8. 'useTLS' => false,
  9. 'host' => '127.0.0.1',
  10. 'port' => 6001,
  11. 'scheme' => 'http',
  12. )
  13. );
  14. return $pusher->socket_auth($request->request->get('channel_name'),$request->request->get('socket_id'));
  15. });


我是否需要做一些额外的事情来使它工作?这是auth请求:
x1c 0d1x的数据



EDIT:GameEventevent:

  1. class GameEvent implements ShouldBroadcastNow {
  2. use Dispatchable, InteractsWithSockets, SerializesModels;
  3. public $gameEvent;
  4. public $gameId;
  5. /**
  6. * Create a new event instance.
  7. *
  8. * @return void
  9. */
  10. public function __construct($gameEvent, $gameId) {
  11. //
  12. $this->gameEvent = $gameEvent;
  13. $this->gameId = $gameId;
  14. }
  15. /**
  16. * Get the channels the event should broadcast on.
  17. *
  18. * @return \Illuminate\Broadcasting\PresenceChannel|array
  19. */
  20. public function broadcastOn() {
  21. //return new PrivateChannel('channel-name');
  22. return new PresenceChannel('game.0');
  23. }
  24. public function broadcastWith() {
  25. return $this->gameEvent;
  26. }
  27. }


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

uajslkp6

uajslkp61#

这里的问题似乎是Echo没有在正确的频道上收听。首先,Echo.join使用的是频道game.0,其中0是用户的id,我不认为实际上有一个id为0的用户。其次,你正在广播,
GameEvent
并且Echo正在连接到名为game的频道。{id}我建议您从事件文件中删除broadcastAs()函数或侦听GameEvent。还可以使用WebSocket Jmeter 板进行测试。 Jmeter 板将在
/laravel-websockets
自动路由,这只适用于本地环境,因此请确保该环境在您的. env中是本地的。
使用laravel-websockets提供的调试 Jmeter 板将数据发送到通道,首先在 Jmeter 板中连接到您的Web套接字,然后只需输入通道名称,事件名称和JSON格式的数据,并在 Jmeter 板上单击send。x1c 0d1x尝试找出这是否有助于解决您的问题。
我还建议彻底阅读laravel's official documentation on broadcasting以及laravel-websockets debugging dashboard guide。也更新你得到的结果,这个问题。

7kjnsjlb

7kjnsjlb2#

当你使用broadcastAs()时,根据Laravel文档,你需要在Echo.join()中的频道名称之前放一个.

  1. Echo.join('.game.' + "0")

字符串

相关问题