【问题标题】:Laravel Echo not listening only on private channelLaravel Echo 不仅仅在私人频道上收听
【发布时间】:2019-11-05 17:14:21
【问题描述】:

我正在尝试使用 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,
});

这是我的 routes/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();

...

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

【问题讨论】:

    标签: laravel-5.7 laravel-echo


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      应该是这样的:

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

      【讨论】:

        【解决方案3】:

        只给别人

        如 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) => {
                //
            })
        

        【讨论】:

          猜你喜欢
          • 2020-01-15
          • 2020-02-13
          • 2019-06-04
          • 2017-11-27
          • 2020-11-22
          • 1970-01-01
          • 2020-04-14
          • 2020-12-21
          • 2019-02-08
          相关资源
          最近更新 更多