Прослушать обратный вызов не работает в 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);
}
}