Прослушать обратный вызов не работает в Pusher API Laravel 5.4

Проблема

Я могу подтвердить, что Pusher API получает сообщение. Я видел в консоли Debug веб-сайта Pusher. Но прослушать обратный вызов вообще не работает.

Я следую этому руководству по реализации Pusher в Laravel 5.4

Ниже были сделанные шаг за шагом.

  • composer require pusher/pusher-php-server
  • npm install --save laravel-echo pusher-js
  • экземпляр экземпляра Echo в вашем resources/assets/js/bootstrap.js
  • Инициализировал ключ толкателя в env и в bootstrap.js файле.

Наконец, я написал ниже код в клике.

<script>
    window.Echo.channel('SendMessageChannel.1')
        .listen('App.Events.SendMessageEvent', (e) => {
            console.log(e);
        });
</script>

Код контроллера

broadcast(new SendMessageEvent("Hi"))->toOthers();

Код события

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

    public $Message;

    public function __construct($message)
    {
        $this->Message = $message;
    }

    public function broadcastOn()
    {
        return new PrivateChannel('SendMessageChannel.2');
    }

}

Я что-то пропустил?

Ответы

Ответ 1

  • Вам нужно выслушать: SendMessageEvent без пространства имен.
  • когда вы слушаете частный канал, вам нужно слушать private-SendmessageChannel или использовать Echo.private('SendmessageChannel')

Поскольку мы исправляем проблему с помощью команд в некоторых частях, трудно объяснить это в этом ответе полностью.

Одной из проблем было то, что событие было запущено до того, как клиент начал его слушать. Лучший способ - отладка с консолью толкателя и запуск пользовательских событий.

Ответ 2

Я использую Laravel 5.4 событий довольно эффективно с 6 месяцев с проектом. У меня была такая же проблема, когда я делал начальную настройку. Позвольте мне вести вас с тем, что я сделал, чтобы заставить его работать.

Я вижу, что у вас есть controller, чтобы инициировать событие, SendMessageEvent, чтобы отправить содержимое сообщения в pusherjs. Вам нужно проверить следующие вещи, чтобы это произошло.

Проверить 1:

Но вы не упомянули, если вы определили Eventhandler. Обработчик событий работает как мост между SendMessageEvent и его фактическим вещателем. Поэтому определите Eventhandler для создания таких папок, как app / Handlers / Events /. (здесь обработчики и события - это папки, в которых события находятся внутри обработчиков)

создайте один файл внутри этой папки событий с именем, например.

HandleMyMessage.php И поставьте в нем этот код:

<?php
namespace App\Handlers\Events;
use App\Events\SendMessageEvent;    // This should be your event class..
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;

class HandleMyMessage{
   protected $name;

   public function __construct() {
      //
   }
   public function handle(Message $event) {
        // No need to write anything here
   }
}

Проверить 2: В месте app / Providers / EventServiceProvider.php должен быть один провайдер, и введите следующий код в EventServiceProvider.php

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Event;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;

class EventServiceProvider extends ServiceProvider
{
    /**
     * The event listener mappings for the application.
     *
     * @var array
     */
    protected $listen = [
        'App\Events\SendMessageEvent' => [
            'App\Handlers\Events\EventServiceProvider',
        ],
    ];

    /**
     * Register any events for your application.
     *
     * @return void
     */
    public function boot()
    {
        parent::boot();
    }
}

Проверить 3: И вы должны изменить синтаксис отправки сообщения о событиях в вашем контроллере следующим образом:

$broadcast_data['first_name'] = 'John';
$broadcast_data['last_name'] = 'Doe';
$return_socket['data'] = $broadcast_data;

Event::fire(new Message($return_socket));       //  Sending message to pusherjs via Laravel Event.

Подробнее об этом вам также понадобится Redis, установленный в вашей системе, и запустите его.

Надеюсь, это поможет. Если вам нужна дополнительная информация для любого из вышеперечисленного, просто прокомментируйте. Я размещаю ссылку для этого же.

Счастливое кодирование!!!: -)

Ответ 3

Я заработал. Ниже приведен правильный код. Надеюсь, это будет полезно другим пользователям для отправки сообщений в режиме реального времени.

Работа Js

<script>
    window.Echo.channel('private-SendMessageChannel.{!! \Auth::user()->UserID !!}')
        .listen('SendMessageEvent', (e) => {
            console.log(e);
        });
</script>

Код контроллера

broadcast(new SendMessageEvent("Hi", 1))->toOthers();
//Here 1 is recepient ID

Код события

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

    public $Message;
    private $UserID;

    public function __construct($message, $RecepientID)
    {
        $this->Message = $message;
        $this->UserID = $RecepientID;
    }

    public function broadcastOn()
    {
        return new PrivateChannel('SendMessageChannel.' . $UserID);
    }

}