Частный канал Laravel Echo с сервером Laravel echo / Redis

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

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

$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, поэтому в успехе вызов:

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 ответов


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

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

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 listeners для каждый клиент, когда страница загружается-не после определенного запроса-так что они могут получать уведомления в любое время другой клиент ссылается на них клиента.

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

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