Laravel Echo不只在私人频道上收听

时间:2019-06-23 20:08:15

标签: laravel-5.7 laravel-echo

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

我还使用了 beyondcode / Laravel-Websockets 包,它在websockets仪表板面板中显示了所有连接和事件。它显示了包本身建立的私人连接,我的公共连接以及所有触发的事件(私人和公共),但没有显示我的私人连接

如果事件被触发并将数据保存在数据库中,则所有工作都很好,除了在视图中,我没有从触发的私有事件中接收任何数据

当预定义为“ ^ 1.5.4”

时,我尝试将Laravel Echo版本降级为“ ^ 1.3.2”

这是我在私人频道播出的laravel事件

<?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 特征,因此我不需要使用队列

这是我的bootstrap.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,
});

这是我的route / channels.php文件


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

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

这是我在nuevo-gasto-channel上监听NuevoGasto事件时的视图文件


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

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


...

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

...

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

在“NuevoGasto”事件中添加一个点

应该是这样的:

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

答案 2 :(得分:0)

仅供他人使用

正如 Laravel 文档中提到的。 Doc

您仅用于其他人,这意味着它不会向您当前的用户发送事件。

尝试使用此处提到的直接事件调度Doc


<块引用>

并且请记住以下有关广播名称和命名空间的事项。

广播名称

正如 Laravel 文档中提到的那样。 Doc

默认情况下,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 时通过传递 namespace 配置选项来配置根命名空间:

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

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

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