#laravel #events #echo #pusher #laravel-livewire
#laravel #Мероприятия #эхо #толкатель #laravel-livewire
Вопрос:
Я настроил систему уведомлений с помощью Pusher и Echo в своем приложении Laravel 8. Это работает нормально, я могу получить событие уведомления в VanillaJS с
window.Echo.private('App.Models.User.' User.id)
.notification((notification) => {
if (notification.type === 'App\Notifications\JobLiked') {
let count = document.getElementById('count');
let number = count.innerHTML;
number ;
count.innerHTML = number;
}
});
Но теперь я хочу использовать прослушиватели Livewire для запуска моей функции, затем я настраиваю :
public function getListeners()
{
return [
"echo-private:App.Models.User.{$this->authId},NotificationSent" => 'notifyNewJobLiked',
];
}
Но, похоже, ничего не работает, и у меня нет сообщения об ошибке.. есть ли у вас какие-либо подсказки, что может произойти?
Большое вам спасибо! 🙂
Ответ №1:
Попробуйте настроить прослушиватель со следующим конкретным именем события:
public function getListeners()
{
return [
"echo-private:App.Models.User.{$this->authId},.Illuminate\Notifications\Events\BroadcastNotificationCreated" => 'notifyNewJobLiked',
];
}
Поскольку вы используете уведомления Laravel для запуска широковещательной передачи вместо события, подлежащего трансляции, по умолчанию используется имя события при запуске Illuminate\Notifications\Events\BroadcastNotificationCreated
.
В Echo есть два метода прослушивания входящих сообщений: notification
и listen
. Причина, по которой он работает с вашим ванильным js, заключается в том, что вы используете notification
метод, тогда как прослушиватель событий livewire работает только с Echo listen
, который ожидает имя вызывающего события.
Если вы используете pusher, вы можете увидеть имя вызывающего события в консоли отладки pusher.
Также позаботьтесь и добавьте точку перед событием с пространством имен, как описано в документации.
Ответ №2:
Правильный способ получения эхо-уведомлений в livewire:
public function getListeners()
{
$user_id = auth()->user()->id;
return [
"echo-notification:App.Models.User.{$user_id}, notification" => 'gotNotification'
];
}
Как вы можете видеть, тип канала — уведомление, а не частный:
эхо-уведомление
Также не забудьте иметь запись, подтверждающую подлинность пользователей в вашем маршруте каналов, так же, как и для частного канала:
Broadcast::channel('App.Models.User.{id}', function ($user, $id) {
return (int) $user->id === (int) $id;
});
Еще одна вещь, которую я узнал, это то, что вы можете получить данные канала уведомлений из возвращаемого поля.
Итак, вы можете сделать:
public function gotNotification($notification)
{
}