0

我正在阅读本教程介绍 Laravel Echo。广播的事情正在完善。每当我执行命令时php artisan chat:message "something"。事件被触发并将数据存储在数据库中。但是继续使用 Laravel Echo。我尝试了很多,但我无处可去。我已将 Echo 放入其中,/js/app.js但在文档中提到了/js/bootstrap.js. 由于我正在关注本教程,因此我将它放在/js/app.jsEcho 中,不会在日志中显示数据。我正在使用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 回声:

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 能够正确发送。

4

1 回答 1

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 的注释。默认情况下未启用。

在路由/channels.php

Broadcast::channel('<channel_name_without_private_prefix>', function ($user) {
    //Auth check
    return true;
});
于 2017-03-19T10:50:28.367 回答