当前位置: 首页 > 知识库问答 >
问题:

推手不在私人频道上广播-PHP/Laravel

楚权
2023-03-14

我已经为我的应用程序设置了Pusher和Laravel Echo,以便在某些事件触发时通知用户。

我已经测试过,看看设置是否通过在“公共频道”上播放而工作,并成功地看到这是工作。

以下是活动本身:

class ItemUpdated implements ShouldBroadcast
{
  use Dispatchable, InteractsWithSockets, SerializesModels;

  public $item;

  public function __construct(Item $item)
  {
      $this->item = $item;
  }

  public function broadcastOn()
  {
      return new Channel('items');
  }
}

公共频道:

Broadcast::channel('items', function ($user, $item) {
  return true;
});

app/resources/assets/js/bootstrap。js:

import  Echo from 'laravel-echo';
window.Pusher = require('pusher-js');

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: 'my_key',
    cluster: 'eu',
    encrypted: true
});

和Laravel回声注册:(它是在我的主布局的头部部分,事件射击视图延伸。)

<head>
<meta charset="utf-8">


<meta name="csrf-token" content="{{ csrf_token() }}">

<script src="{{ asset('js/app.js') }}"></script>

<script>
    window.Laravel = {'csrfToken': '{{csrf_token()}}'}

    window.Echo.channel('items')
    .listen('ItemUpdated', function(e) {
        console.log("It is working:)");
    });

</script>
</head>

现在,这种设置适用于公共频道广播,但当我尝试在私人频道广播时,我会

  //updated "ItemUpdated" event broadcastOn() method
  public function broadcastOn()
  {
      return new PrivateChannel('items');
  }

//updated laravel echo registering
<script>
window.Laravel = {'csrfToken': '{{csrf_token()}}'}

window.Echo.private('items')
.listen('ItemUpdated', function(e) {
    console.log("It is working:)");
});
 //console logged error
Pusher couldn't get the auth user from :myapp 500

我已经检查了来自开发者控制台的传出网络请求,发现pusher正试图“发布”到

http://localhost:8000/broadcast/auth

但它得到了500个错误代码

我想这可能有助于解决问题。

我该怎么办?

共有1个答案

卢俭
2023-03-14

所以我想出了如何实现私有通道监听,并使其正常工作。

我的错误是通配符选择。

我告诉它使用经过身份验证的用户id作为通配符,而不是应用更改的项id。

因此,这个下面的通道注册总是返回假,并导致推销员扔500授权找不到。

  Broadcast::channel('items.{item}', function ($user, \App\Item $item) {
    return $user->id === $item->user_id;
});

正在播放的活动:

//ItemUpdated event

class ItemUpdated implements ShouldBroadcast
{
   use Dispatchable, InteractsWithSockets, SerializesModels;

   public $item;

   public function __construct(Item $item)
   {
       $this->item = $item;
   }

   public function broadcastOn()
   {
       return new PrivateChannel('items.'.$this->item->id);
   }
}

频道注册:

app\routes\channels.php    

Broadcast::channel('items.{item}', function ($user, \App\Item $item) {
    return $user->id === $item->user_id;
});

Laravel回波注册:

<head>

<meta name="csrf-token" content="{{ csrf_token() }}">


<script>
    window.Laravel = {'csrfToken': '{{csrf_token()}}'}

    window.Echo.private(`items.{{{$item->id}}}`)
    .listen('ItemUpdated', function(e) {
        console.log("It is working!");
    });

</script>

谢谢大家的指点。

 类似资料:
  • 我有安装插座。io与laravel echo一起加入并收听laravel广播频道。公共频道工作正常,因为它们不需要任何授权。专用通道未按预期工作,我可以使用套接字加入任何专用通道。未传递授权令牌的io客户端。 插座io客户端 Laravel Echo服务器配置 航道 广播服务提供商 用户配置 127.0.0.1:8000/无令牌访问时的广播/授权响应 Laravel回声服务器 所以我猜larave

  • 我正在尝试创建一个实时聊天应用程序。我使用了Laravel Echo、Redis和socket io。 但是没有收听私人广播聊天频道。 应用程序事件消息推送

  • 活动是: 路线/频道。php是: 在刀片文件中: 广播频道工作正常。但在私密频道里,这是行不通的。并且在控制台中没有显示任何错误 我使用拉威尔回声和推进器

  • 我正在使用Laravel-Redis-Socketio-LaravelEcho进行实时通知。到目前为止,我能够广播到公共频道,但坚持与私人频道。 我的bootstrap.js: 拉威尔回声服务器。json: 在我的notification类中,我将broadcastOn()设置为: 我的客户是: 在公共频道中一切正常,但在私有频道中,启动laravel-echo-server后,命令行显示以下内容

  • 问题内容: 我是新手,我正在尝试创建一个简单的聊天服务器,客户端可以在其中向所有连接的客户端广播消息。 在我的服务器中,我有一个goroutine(无限循环),它接受连接,并且所有连接都由一个通道接收。 然后,我为每个连接的客户端启动一个处理程序(goroutine)。在处理程序内部,我尝试通过迭代通道来广播到所有连接。 但是,我无法广播,因为(我认为通过阅读文档)通道需要在迭代之前关闭。我不确定

  • 我正在尝试使用专用通道验证laravel echo。每次我收到“无法验证到private-U详细信息。1”。“basket_details”这是通道名称,1是参数。 当我使用公共频道时,一切都很完美。因此,我认为auth部分存在一些问题。 这是我的错误日志 这是我的事件文件。 这是我的频道。php 这是我的js文件 这是我的BroadcastServiceProvider 这是我的laravel