Laravel транслирует уведомление всем друзьям

Я пытаюсь реализовать функцию уведомлений на своем веб-сайте. Вот мой код (надеюсь, мой подход правильный)

-создайте канал под названием уведомление. {userId} (userId – это идентификатор пользователя, прошедшего проверку подлинности) -когда я, например, комментирую его сообщение, запускайте событие NewComment, которое транслируется в уведомлениях.{$notification-> идентификатор_пользователя

вот мой код:

public function newComment($post, $user){
    $notification = new Notification; // this is notification model for my database table
    $notification->type = 'new-comment';
    $notification->notified_by = $user->id;
    $notification->user_id = $post->owner->id;
    $notification->save();

    event(new NewNotification($notification));
}

Событие NewNotification.php

<?php

namespace App\Events;

use App\Models\Notification;
use App\Transformers\NotificationTransformer;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class NewNotification
{
    protected $notification;

    use Dispatchable, InteractsWithSockets, SerializesModels;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct(Notification $notification)
    {
        $this->notification = $notification;
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return Channel|array
     */
    public function broadcastOn()
    {
        return new PresenceChannel('notification.' . $this->notification->user_id);
    }

    public function broadcastWith(){
        return fractal()->item($this->notification, new NotificationTransformer());
    }
}

Маршрут канала трансляции:

Broadcast::channel('notification.{userId}', function($user, $userId){
      //comparing ($userId == $user->id) always turns true 
});

Подписка на канал присутствия на стороне клиента (с помощью Vue):

Echo.join('notification.' + this.user_id) //user_id is logged in user id
              .listen('NewNotification', function(response){
                console.log(response);
              });

По какой-то причине событие никогда не вызывается. Я не знаю, должен ли я изменить логику в маршруте широковещательного канала. Должен ли я передать идентификатор уведомления и проверить, есть ли уведомление->user_id === $user->id . Я тестировал этот способ, но все еще не ответил в консоли.


person trying to learn    schedule 03.02.2018    source источник
comment
Как настроен ваш драйвер очереди?   -  person    schedule 03.02.2018
comment
@btl, это база данных. Я думаю, что забыл запустить работника очереди в терминале. Также я не уверен, если я использую частный канал, срабатывает ли событие в канале, если канал занят (имеет только 1 пользователя), поскольку пользователь будет слушать только свой канал?   -  person trying to learn    schedule 03.02.2018
comment
Да, убедитесь, что рабочий работает. Я думаю, что пользователь должен активно слушать событие для маршрутизации, хотя и не уверен на 100%. Используете ли вы эхо-сервер laravel? Или просто веб-сокет сам по себе?   -  person    schedule 03.02.2018
comment
Я использую эхо-сервер laravel   -  person trying to learn    schedule 03.02.2018
comment
Окей круто. Ваши каналы выглядят правильно. Веб-инспектор показывает, что соединение ws работает?   -  person    schedule 03.02.2018
comment
Я использую Redis для очереди и Laravel Horizon для управления рабочими процессами. Это хорошая настройка, которая значительно упрощает отладку.   -  person    schedule 03.02.2018
comment
@btl Я получил ожидаемые результаты после запуска очереди. Иногда я забываю, что у меня нет автоматизированных заданий на локальном сервере xD. Я планирую внедрить Beanstalk в будущем.   -  person trying to learn    schedule 03.02.2018
comment
Круто, рад, что работает. Вы должны настроить супервизор или pm2 и запустить их при запуске. Я также забываю о запуске очереди, так что хорошо обрабатывать ее автоматически.   -  person    schedule 03.02.2018


Ответы (1)


Я надеюсь, что кто-то найдет этот ответ полезным:

Чтобы запустить событие, класс события должен реализовать класс ShouldBroadcast.

So

class NewNotification{
   //code here
}

становится

class NewNotification implements ShouldBroadcast{
   // code here
}

Не забудьте запустить queue:listen, если вы не настроили автоматические задания

person trying to learn    schedule 03.02.2018