Laravel 事件广播没有被拾取 laravel-echo-server

Posted

技术标签:

【中文标题】Laravel 事件广播没有被拾取 laravel-echo-server【英文标题】:Laravel Event Broadcast not being picked up laravel-echo-server 【发布时间】:2020-02-18 23:16:04 【问题描述】:

我正在尝试使用 laravel-echo-server (socket.io) 我遇到了一个障碍,客户端似乎没有收到任何广播事件。

一切似乎都连接得很好,socket.io 服务器报告它正在连接并授权用户但是当我广播一条消息时似乎什么都没有发生。该事件出现在 Laravel Horizo​​n 上,但除此之外,什么也没有发生。这是我的代码:

server.js 运行 laravel-echo-server:

require('dotenv').config();

const env = process.env;

require('laravel-echo-server').run(
    authHost: env.APP_URL,
    devMode: env.APP_DEBUG,
    database: "redis",
    databaseConfig: 
        redis: 
            host: env.REDIS_HOST_PUBLIC,
            port: env.REDIS_PORT,
        
    
);

channel.php中我的频道

Broadcast::channel('message.pushed', function () 
    return true;
);

我的活动:

<?php

namespace App\Events;

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

class MessagePushed implements ShouldBroadcast

    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $message;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct()
    
        $this->message = "My New Message";
    

    /**
     * Get the channels the event should broadcast on.
     *
     * @return Channel|array
     */
    public function broadcastOn()
    
        return new PrivateChannel('message.pushed');
    


我在 app.js 中的事件监听器

import Echo from 'laravel-echo';
window.io = require('socket.io-client');


if (typeof io !== 'undefined') 
    var token = $('meta[name="_token"]').attr('content')
    window.Echo = new Echo(
        auth       : 
            headers: 
                Authorization: `Bearer $token`,
            ,
        ,
        broadcaster: 'socket.io',
        host       : window.location.hostname + ':6001',
    );




function listenForBroadcast() 
    Echo.private('message.pushed')
    .listen('MessagePushed', (e) => 
        console.log(e)
        console.log("Listened")
    );


listenForBroadcast();

最后是发送消息的路由:

Route::get('/event-test', function () 
    broadcast(new App\Events\MessagePushed());
);

我不太确定我哪里出错了,或者为什么客户没有收到任何东西。

查看 laravel-echo-server 时,命令行正在回显:

Channel: laravel_database_private-message.pushed
Event: App\Events\MessagePushed

【问题讨论】:

【参考方案1】:

在您的浏览器中,您需要像 redis 显示的那样监听 Channel 并像 redis 显示的那样监听事件,因此更改您的 listenForBroadcast() 方法可能会有所帮助。 代码中,Channel 名称从 message.pushed 更改为 laravel_database_private-message.pushed,Event 名称从 MessagePushed 更改为 .App\Events\MessagePushed(不要错过 App 的点前缀)

function listenForBroadcast()         
    Echo.private('laravel_database_private-message.pushed')         
    .listen('.App\\Events\\MessagePushed', (e) =>  
        console.log(e)
        console.log("Listened")
    );

我根据以下链接中给出的解决方案尝试了这个解决方案,它对我有用 laravel Echo does not listen to channel and events

【讨论】:

以上是关于Laravel 事件广播没有被拾取 laravel-echo-server的主要内容,如果未能解决你的问题,请参考以下文章

laravel5.5事件广播系统

Laravel 5.4 事件广播不适用于 vuejs

Laravel Homestead , Socket.io 连接被拒绝

广播 laravel 事件和多个频道

广播到推送器时如何重命名 Laravel 事件?

Laravel事件不是广播