使用Pusher和Laravel Echo进行广播

时间:2016-12-01 05:47:24

标签: laravel laravel-5.3 pusher laravel-echo

我正在阅读本教程Introducing Laravel Echo。广播的事情正在努力完善。每当我执行命令php artisan chat:message "something"时。事件被触发并且数据存储在数据库中。但转到Laravel Echo。我尝试了很多,但我不会去哪里。我已将Echo放入/js/app.js,但在文档中提到了/js/bootstrap.js。由于我正在学习本教程,因此我将其放入/js/app.js Echo未在日志中显示数据。我正在使用ubuntu

测试活动:

class TestEvent implements ShouldBroadcast
{
    use InteractsWithSockets, SerializesModels;
    public $message;
    public $user;
    /**
     * Create a new event instance.
     *
     * @return void
     */
public function __construct($user, $message)
    {
        //
        $this->user = $user;
        $this->message = $message;
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return Channel|array
     */
 public function broadcastOn()
    {
        return "chat-room";
    }
    }

发送聊天命令代码:

class SendChatMessage extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'chat:message {message}';

    protected $description = 'Send chat message.';

    public function handle()
    {
        // Fire off an event, just randomly grabbing the first user for now
        $user = \App\User::first();
        $message = \App\Message::create([
            'user_id' => $user->id,
            'content' => $this->argument('message')
        ]);

        event(new \App\Events\TestEvent($message, $user));
    }

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
}

Laravel Echo:

import Echo from "laravel-echo"

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: 'my-key'
});

window.Echo.channel('chat-room')
    .listen('TestEvent', (e) => {
        console.log(e.user, e.message);
});
每当我从推送器发送一个事件时,还有一件事。 Pusher能够正确发送它。

1 个答案:

答案 0 :(得分:0)

不确定它是否仍然相关,但可能有助于某人。

我正在使用Laravel 5.4并在推送器中使用'eu'集群。请注意,有时推动者会发疯。它开始晚收到广播事件。所以,我使我的事件实现了ShouldBroadcastNow合同而不是ShouldBroadcast来克服这个问题。我没有使用队列将事件发布到推送器。即便如此,有时候我注意到接收事件的延迟。无论如何,广播部分都很好。

现在,在客户端,这是我用来监听从推送器触发的事件的脚本(在我的情况下是私人频道)

bootstrap.js(在Laravel 5.4中默认可用)

import Echo from "laravel-echo"

 window.Echo = new Echo({
     broadcaster: 'pusher',
     key: '<your_pusher_app_key>',
     csrfToken: window.Laravel.csrfToken,
     cluster:'eu',
     encrypted: true  });

如果对bootstrap.js进行更改,则应编译JS,否则您的更改将不会打包到公用文件夹中。 Laravel 5.4使用Laravel Mix,编译命令是“npm run dev”

在我的刀片模板中:

 window.Echo.private('<channel_name_without_prefixing_private_keyword>')
    .listen("<Just the event class name and not fully qualified name>", function(e){
        console.log(e);
    });

这对我有用。此外,确保在config \ app.php文件中取消注释BroadcastServiceProvider。它默认不启用。

在routes / channels.php

Broadcast::channel('<channel_name_without_private_prefix>', function ($user) {
    //Auth check
    return true;
});