Laravel Echo не получает события puher

#laravel #vue.js #pusher

#laravel #vue.js #толкатель

Вопрос:

Мои события поступают на толкатель, как-

Событие — сообщение API

Подробности — Канал: приватный чат, событие: App Events messageSent

Но в моем интерфейсе Vue Echo не получает никаких событий от pusher.

MessageSent.php

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

    public $message;
    public $user;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct(User $user, Message $message)
    {
        $this->user = $user;
        $this->message = $message;
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return IlluminateBroadcastingChannel|array
     */
    public function broadcastOn()
    {
        return new PrivateChannel('chat');
    }
}
 

чат.vue

   mounted() {
    Echo.private("chat").listen("MessageSent", (e) => {
      console.log("Received");
      this.allMessages.push(e.message);
      this.fetchMessages();
    });
  },
 

bootstrap.js

 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,
    forceTLS: true,
});
 

routes/channels.php

 Broadcast::channel('chat', function ($user) {
    return auth()->check();
});
 

Я также настроил broadcast driver = pusher и все учетные данные pusher в моем файле .env

Комментарии:

1. Вы добавили логику авторизации routeschannels.php ?

2. Вы видели какую-либо ошибку в своем инструменте разработки?

3. Ошибки нет.

Ответ №1:

В событии messageSent сделайте это

 public function broadcastOn()
{
    Broadcast::routes(['middleware' => ['auth:api']]);
    return new PrivateChannel('chat');
}
 

И в BroadcastServiceProvider добавьте следующую строку:

 Broadcast::routes(['middleware' => ['auth:api']]);
 

Комментарии:

1. Но интерфейс vue не является отдельным приложением. Это внутри laravel. Поэтому я не использую здесь никаких маршрутов api.

2. Если вы используете Laravel Auth, включите его в свой личный канал. В противном случае включите другое промежуточное программное обеспечение, которое вы используете для аутентификации пользователя. Для частного канала требуется промежуточное программное обеспечение, иначе оно не будет работать.

Ответ №2:

Я решил это, поместив приведенный ниже код из bootstrap.js чтобы app.js . Итак, в моем app.js —

 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,
    forceTLS: true,
});
 

Но я не знаю, почему тот же код не работает в bootstrap.js