【问题标题】:Laravel livewire not handle listener from broadcastLaravel livewire 不处理广播中的监听器
【发布时间】:2021-11-09 22:56:05
【问题描述】:

我尝试在 laravel livewire 中收听广播发出的事件,但没有任何反应;

在我的 bootstrap.js 上我有:

import Echo from 'laravel-echo';

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

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: 'myKey',
    wsHost: window.location.hostname,
    wsPort: 6001,
    disableStat: true,
    forceTLS: false,
});

我的活动 laravel

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

    public function __construct()
    {
        //
    }

    public function broadcastAs(){
        return 'task-finish';
    }

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

我的听众

class SendTaskNotif
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  TaskFinished  $event
     * @return void
     */
    public function handle(TaskFinished $event)
    {
    }
}

还有我的 livewire 组件

protected $listeners = ['echo:TaskTricolor,TaskFinished' => 'eventlisten'];

    // public function getListeners(){
    //     return [
    //         'echo:TaskTricolor,TaskFinished' => 'eventlisten'
    //     ];
    // }

    public function start(){
        $this->start = true;
        $tricolors = new TricolorController();
        $this->tricolor = $tricolors->start();
    }

    public function stop(){
        $this->start = false;
        $tricolors = new TricolorController();
        $this->tricolor = $tricolors->stop();
    }
    

    public function emet(){
        event(new TaskFinished());
    }

    public function eventlisten(){
        $vars = "test";
        dd($vars);
    }

在我的听众上,我输入了dd('test'),当调用 emet 函数时,会显示 dd 值;

因此,当我使用 livewire 侦听器处理程序进行测试时,什么也没有发生,我的 dd 没有出现,也没有错误;

我尝试从刀片控制台记录 Echo 以测试我是否可以处理侦听器,但它显示 Echo 未定义,但是当我在 console.log 窗口中时,我看到 Echo 在里面

在我的 websocket 仪表板上,我有这个:

不知道能不能解决,我用的是beyondcode/laravel-websockets包作为驱动

【问题讨论】:

    标签: laravel broadcast laravel-livewire laravel-echo


    【解决方案1】:

    当我第一次开始使用 Livewire(1.0 版)时,我们使用 vanilla javascript 收听消息,然后调用 Livewire。

    document.addEventListener("DOMContentLoaded", function () {
        window.Echo.private('TaskTricolor')
            .listen('.task-finish', (response) => { 
                window.Livewire.emit('task-finish', response));
            }
        });
    

    你可以试试这个。作为您的方法,这不是一个干净的解决方案,但我认为更容易调试。

    【讨论】:

    • 试过了,我在监听中使用了 console.log('text') 但没有出现
    • 您是否尝试将 Echo.private 更改为 Echo.channel?
    • 是的,我改变了,在启动项目时,我的 websocket 看到事件 TaskTricolor 在那里,当调用 event(new TaskFinished()) 时,websocket 仪表板上没有通知,我没有不知道它是否必须显示调用的事件,但 Echo 没有反应;更多信息,我使用的是 laravel-websocket 驱动程序,而不是 pusher,如果它可以帮助解决
    • 不知道。所以这个问题看起来与 livewire 或 javascript 无关。回声什么都听不见。你的 app.blade.php 有标签 <meta name="csrf-token" content="{{ csrf_token() }}">?
    【解决方案2】:

    我发现了问题;在我的事件类中,我应该使用 ShouldBroadCastNow 而不是 ShouldBroadCast

    class TaskFinished implements ShouldBroadcastNow
    {
        use Dispatchable, InteractsWithSockets, SerializesModels;
    
        public function __construct()
        {
            //
        }
    
        public function broadcastAs(){
            return 'task-finish';
        }
    
        public function broadcastOn()
        {
            return new Channel('TaskTricolor');
        }
    }
    

    ShouldBroadCast 将事件放入队列中,因此它不会在事件调用时被激活,但 ShouldBroadCastNow 立即监听事件,here 链接我找到了解释

    【讨论】:

      猜你喜欢
      • 2021-08-15
      • 2017-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多