Частный канал Laravel Echo с эхо-сервером Laravel | Redis - PullRequest
0 голосов
/ 03 сентября 2018

Сценарий: Клиент может направить клиента к другому клиенту. Каждый реферал должен храниться в строке таблицы БД. Клиент, получивший направление, должен увидеть уведомление о событии.

Создайте нового реферала и отправьте событие:

$totalRefers = [];

foreach ($array as $to) {
    $refer = new ClientReferral;
    $refer->user_id = $user_id;
    $refer->by = $by;
    $refer->to = $to;

    $refer->save();
    array_push($totalRefers, $refer);

    ReferralSent::dispatch($refer); // Here is the Event
}

return response()->json([
    'status' => 'Success',
    'message' => 'Client referred successfully to selected professionals.',
    'data' => $totalRefers
], 200);

Событие broadcastOn() Метод:

public function broadcastOn() {
    return new PrivateChannel('referral.' . $this->referral->id);
}

Канал:

Broadcast::channel('referral.{id}', function ($user, $id) {
    // let's say it's true for the time being
    return true;
});

И запрос является AJAX POST, поэтому в обратном вызове успеха:

console.log('referral created');
res.data.forEach(function(entry) {
    // window.custom.userId is the authenticated user ID:
    if (entry.refer_to == window.custom.userId) { 
        window.Echo.private('referral.' + entry.id).listen('ReferralSent', ({data}) => {
            console.log('You have received a new referral');
        });
    }
});

Теперь проблема с текущим кодом в том, что получатель не может подписаться на этот канал, потому что событие создается динамически, и я не могу сделать имя канала статическим, потому что переход пришел во время выполнения.

Как получатель может подписаться и прослушивать динамические события?

С помощью этой логики я хочу, чтобы этот конкретный реферал и его данные отображались в области уведомлений в HTML.

Как мне этого добиться?

1 Ответ

0 голосов
/ 07 сентября 2018

Событие, показанное в вопросе, транслируется на канал только для этой конкретной реферальной организации Однако получатель, который подписывается на этот канал, должен получать события для всех реферальных сущностей, на которые он ссылается .

Вместо создания контекста канала для самой сущности реферала, опубликуйте канал, назначенный для пользователя , который получает реферал. Я предполагаю, что $referral->to содержит идентификатор этого пользователя:

public function broadcastOn()
{
    return new PrivateChannel('referral.' . $this->referral->to);
}

Обновление канала для авторизации текущего пользователя на основе идентификатора пользователя, получившего реферал:

Broadcast::channel('referral.{refereeId}', function ($user, $refereeId) {
    return $user->id == $refereeId;
});

И на стороне клиента слушайте на том же канале:

window.Echo.private('referral.' + window.custom.userId)
    .listen(e => console.log(e.referral));

Поскольку мы больше не слушаем конкретный идентификатор реферала, мы можем инициализировать подписчика Echo во время загрузки страницы, а не в ответном обратном вызове AJAX.

Широковещательные события предназначены для того, чтобы быть полезными для действий в реальном времени вне обычного цикла запрос / ответ (включая запросы AJAX). В случае этого вопроса мы хотим запустить прослушиватели Echo для каждого клиента, когда страница загружается - не после определенного запроса - чтобы они могли получать уведомления в любое время, когда другой клиент направляет к ним клиента.

Поток выглядит так:

  1. Клиент 1 и Клиент 2 оба открывают приложение, которое запускает Echo на стороне клиента.
  2. Клиент 1 создает реферал для Клиента 2.
  3. Браузер клиента 1 отправляет запрос AJAX для сохранения реферала.
  4. Laravel публикует событие на канале Клиента 2.
  5. Браузер клиента 2 получает событие через Echo, который прослушивает этот канал.
  6. Код, который вы написали для обработки этого события, создает уведомление в браузере Клиента 2.
...