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

Laravel Echo不仅在专用信道上监听

苏高峰
2023-03-14

我试图用Laravel Echo在私人频道上收听,但它不只在私人频道上收听,公共频道工作正常。

我也在使用Beyondcode/Laravel-WebSocket包,它在WebSocket仪表板面板中显示了所有的连接和事件。它显示了包本身的私有连接、我的公共连接和所有触发的事件(私有和公共),但没有显示我的私有连接

如果触发该事件并将数据保存在数据库中,则所有操作都完全正常,只是在视图中,我没有从触发的私有事件接收任何数据

我试图降级我的Laravel回声版本,版本"^1.3.2",当预定义是"^1.5.4"

这是我在私人频道播出的拉威尔事件

<?php

namespace App\Events;

use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;

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

    public $gasto;

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

    public function broadcastOn()
    {
        return new PrivateChannel('nuevo-gasto-channel');
    }
}

注意我使用ShouldBroadcastNow特性,所以我不需要使用队列

这是我的引导程序。js文件包含我的Laravel Echo配置

import Echo from 'laravel-echo'

window.Pusher = require('pusher-js');

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: process.env.MIX_PUSHER_APP_KEY,
    cluster: process.env.MIX_PUSHER_APP_CLUSTER,
    wsHost: window.location.hostname,
    wsPort: 6001,
    disableStats: true,
});

这是我的路线/频道。php文件


Broadcast::channel('nuevo-gasto-channel', function ($user) {
    return true;
});

注意,出于演示目的,我返回true

这是我在新加斯托频道收听新加斯托事件时的视图文件


Echo.private('nuevo-gasto-channel')
    .listen('NuevoGasto', (e) => {
            console.log(e);
});

最后这是我的控制器,我在这里触发事件


...

broadcast(new NuevoGasto($gasto))->toOthers();

...

我没有收到任何错误,只是没有监听私人频道

共有3个答案

邰钟展
2023-03-14

正如在Laravel文档中提到的。医生

您只对其他人使用,这意味着它不会向当前用户发送事件。

尝试使用这里提到的直接事件调度Doc

请记住以下关于广播名称和命名空间的事情。

正如在Laravel文档中提到的。医生

默认情况下,Laravel将使用事件的类名广播事件。但是,您可以通过在事件上定义broadcastAs方法自定义广播名称:

/**
 * The event's broadcast name.
 *
 * @return string
 */

public function broadcastAs()
{
    return 'server.created';
}

如果使用broadcastAs方法自定义广播名称,则应确保使用前导的注册侦听器 字符。

这将指示Echo不要将应用程序的命名空间前置到事件中:

.listen('.server.created', function (e) {
    ....
});

正如这里提到的,你也可以使用命名空间Doc

您可能已经注意到,在上面的示例中,我们没有为事件类指定完整的App\Events命名空间。这是因为Echo将自动假定事件位于App\events命名空间中。但是,在通过传递名称空间配置选项实例化Echo时,可以配置根名称空间:

window.Echo = new Echo({
    broadcaster: 'pusher',
    // ...
    namespace: 'App.Other.Namespace'
});

或者,您可以使用作为事件类的前缀 当使用Echo订阅它们时。这将允许您始终指定完全限定的类名:

Echo.channel('orders')
    .listen('.Namespace\\Event\\Class', (e) => {
        //
    })

牛景同
2023-03-14

在事件"NuevoGasto"中添加一个点

应该是这样的:

enter code here Echo.private('nuevo-gasto-channel')
.listen('.NuevoGasto', (e) => {
        console.log(e);
});
夹谷沛
2023-03-14

尝试在config/App中取消注释App\Providers\BroadcastServiceProvider::class。php,如果您还没有。

 类似资料:
  • 大家好,我工作与Laravel回声和SocketIO没有Vue只有jQuery,但我有一个问题与私人渠道在这里我向你展示,我有两个事件正常和私人渠道正常渠道(todocanales我的事件Hola活动)工作正常,当我午餐的事件 在我的laravel echo服务器控制台中,向我展示: 在浏览器控制台中,我得到 ~~~对象{数据:对象,套接字:null}~~~ 所有完美的,但与私人频道我有问题Lar

  • 问题内容: MongoDB建议,处理安全性的简单方法是在受信任的环境中运行安全性,因为“在这种配置中,必须确保只有受信任的计算机才能访问数据库TCP端口。” 这样做的最佳方法是什么?mongodb是否有办法仅本地监听localhost? 我正在使用Ubuntu 10.10 问题答案: 将以下行添加到: 正如@Josh Rickard在评论中所述:不要忘记在更新配置文件后重新启动进程:

  • 在使用私人频道时,我无法让echo和pusher正常工作,在谷歌上搜索了两天,找到了nada。 似乎正在发生的是某种身份验证问题(我使用Laravel基本身份验证),因为我可以订阅公共频道 路线/频道。php bootstrap.js default.blade.php(主要布局) 控制台上打印的内容是: 这是一个非常普通的错误,然后为了调试的目的,我试图使用Pusher(而不是laravel e

  • 但是私有通道的是什么?不是你私人邀请里的那个。 因为现在我们可以在所有方法中传递通道用户名(格式为@channelusername),而不是forwardMessage中的from_chat_id。但是我管理的私人频道的@ChannelUsername是什么?

  • 问题内容: 我有多个goroutine试图同时在同一频道上接收。似乎最后一个在通道上开始接收的goroutine获得了值。这是语言规范中的某个地方,还是未定义的行为? 输出: 操场上的例子 编辑: 我只是意识到它比我想的还要复杂。该消息在所有goroutine中传递。 输出: 操场上的例子 问题答案: 是的,它很复杂,但是有一些经验法则可以使事情变得简单得多。 宁愿使用 传递给go-routine

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