Вступление

Во многих современных веб-приложениях WebSockets используются для реализации обновляемых в реальном времени пользовательских интерфейсов. Когда некоторые данные обновляются на сервере, сообщение обычно отправляется через соединение WebSocket для обработки клиентом. Это обеспечивает более надежную и эффективную альтернативу постоянному опросу вашего приложения на предмет изменений.

Чтобы помочь вам в создании приложений такого типа, Laravel облегчает «трансляцию» ваших событий через соединение WebSocket. Трансляция ваших событий Laravel позволяет вам совместно использовать одни и те же имена событий между вашим серверным кодом и вашим клиентским JavaScript-приложением.

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

 

Конфигурация

Все настройки трансляции событий вашего приложения хранятся в файле конфигурации. Laravel поддерживает сразу несколько драйверов широковещания: Pusher , Redis и драйвер для локальной разработки и отладки. Кроме того, в комплект поставки входит драйвер, позволяющий полностью отключить трансляцию. Пример конфигурации включен для каждого из этих драйверов в файле конфигурации.config/broadcasting.phplognullconfig/broadcasting.php

Поставщик услуг вещания

Прежде чем транслировать какие-либо события, вам необходимо сначала зарегистрировать . В свежих приложениях Laravel вам нужно только раскомментировать этого провайдера в массиве вашего файла конфигурации. Этот провайдер позволит вам регистрировать широковещательные маршруты авторизации и обратные вызовы.App\Providers\BroadcastServiceProviderprovidersconfig/app.php

CSRF Token

Laravel Echo потребуется доступ к токену CSRF текущего сеанса. Вы должны убедиться, что headэлемент HTML вашего приложения определяет metaтег, содержащий токен CSRF:

<meta name="csrf-token" content="{{ csrf_token() }}">

 

Необходимые условия для водителя

Толкатель

Если вы транслируете свои события через Pusher , вы должны установить Pusher PHP SDK, используя менеджер пакетов Composer:

composer require pusher/pusher-php-server "~3.0"

Затем вы должны настроить свои учетные данные Pusher в файле конфигурации. Пример конфигурации Pusher уже включен в этот файл, что позволяет вам быстро указать свой ключ Pusher, секрет и идентификатор приложения. В файле конфигурация также позволяет указать дополнительным , которые поддерживаются толкателем, такие как кластер:config/broadcasting.phpconfig/broadcasting.phppusheroptions

'options' => [
    'cluster' => 'eu',
    'encrypted' => true
],

При использовании Pusher и Laravel Echo вы должны указать в pusherкачестве желаемого вещателя при создании экземпляра Echo в вашем файле:resources/js/bootstrap.js

import Echo from "laravel-echo";

window.Pusher = require('pusher-js');

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: 'your-pusher-key'
});

Redis

Если вы используете Redis Broadcaster, вы должны установить библиотеку Predis:

composer require predis/predis

Вещатель Redis будет транслировать сообщения, используя функцию паба / субдиска Redis; однако вам нужно будет соединить это с сервером WebSocket, который может получать сообщения от Redis и транслировать их на ваши каналы WebSocket.

Когда вещатель Redis публикует событие, оно будет опубликовано в указанных именах каналов события, а полезной нагрузкой будет строка в кодировке JSON, содержащая имя события, dataполезную нагрузку и пользователя, который сгенерировал идентификатор сокета события (если применимо).

Socket.IO

Если вы собираетесь подключить вещательную систему Redis к серверу Socket.IO, вам необходимо включить в свое приложение клиентскую библиотеку JavaScript Socket.IO. Вы можете установить его через менеджер пакетов NPM:

npm install --save socket.io-client

Далее вам нужно будет создать экземпляр Echo с помощью разъема и a .socket.iohost

import Echo from "laravel-echo"

window.io = require('socket.io-client');

window.Echo = new Echo({
    broadcaster: 'socket.io',
    host: window.location.hostname + ':6001'
});

Наконец, вам нужно запустить совместимый сервер Socket.IO. Laravel не включает реализацию сервера Socket.IO; однако сервер Socket.IO, управляемый сообществом, в настоящее время поддерживается в GitHub-хранилище tlaverdure / laravel-echo-server .

Предварительные условия очереди

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

 

Обзор концепции

Трансляция событий Laravel позволяет вам транслировать события Laravel на стороне сервера в ваше клиентское JavaScript-приложение, используя подход на основе драйверов к WebSockets. В настоящее время Laravel поставляется с водителями Pusher и Redis. События могут быть легко использованы на стороне клиента с помощью пакета Laravel Echo Javascript.

События транслируются по «каналам», которые могут быть определены как публичные или частные. Любой посетитель вашего приложения может подписаться на общедоступный канал без какой-либо аутентификации или авторизации; однако, чтобы подписаться на частный канал, пользователь должен пройти аутентификацию и авторизоваться для прослушивания на этом канале.

 

Использование примера приложения

Прежде чем углубляться в каждый компонент трансляции событий, давайте рассмотрим обзор высокого уровня, используя в качестве примера магазин электронной коммерции. Мы не будем обсуждать детали настройки Pusher или Laravel Echo, поскольку это будет подробно обсуждаться в других разделах этой документации.

В нашем приложении предположим, что у нас есть страница, которая позволяет пользователям просматривать статус доставки для своих заказов. Также предположим, что ShippingStatusUpdatedсобытие обрабатывается обновлением статуса доставки приложением:

event(new ShippingStatusUpdated($update));

ShouldBroadcastИнтерфейс

Когда пользователь просматривает один из своих заказов, мы не хотим, чтобы ему приходилось обновлять страницу для просмотра обновлений статуса. Вместо этого мы хотим транслировать обновления в приложение по мере их создания. Итак, нам нужно отметить ShippingStatusUpdatedсобытие с помощью ShouldBroadcastинтерфейса. Это проинструктирует Laravel транслировать событие, когда оно запущено:

<?php

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

class ShippingStatusUpdated implements ShouldBroadcast
{
    /**
     * Information about the shipping status update.
     *
     * @var string
     */
    public $update;
}

ShouldBroadcastИнтерфейс требует нашего мероприятия , чтобы определить broadcastOnметод. Этот метод отвечает за возврат каналов, по которым должно транслироваться событие. Пустая заглушка этого метода уже определена в сгенерированных классах событий, поэтому нам нужно только заполнить ее детали. Мы только хотим, чтобы создатель заказа мог просматривать обновления статуса, поэтому мы будем транслировать событие на частном канале, связанном с заказом:

/**
 * Get the channels the event should broadcast on.
 *
 * @return \Illuminate\Broadcasting\PrivateChannel
 */
public function broadcastOn()
{
    return new PrivateChannel('order.'.$this->update->order_id);
}

Авторизация каналов

Помните, что пользователи должны быть авторизованы для прослушивания на частных каналах. Мы можем определить правила авторизации нашего канала в файле. В этом примере нам нужно убедиться, что любой пользователь, пытающийся прослушать частный канал, действительно является создателем заказа:routes/channels.phporder.1

Broadcast::channel('order.{orderId}', function ($user, $orderId) {
    return $user->id === Order::findOrNew($orderId)->user_id;
});

channelМетод принимает два аргумента: имя канала и обратный вызов , который возвращает trueили falseуказывающий, имеет ли пользователь право слушать на канале.

Все обратные вызовы авторизации получают аутентифицированного пользователя в качестве первого аргумента, а любые дополнительные параметры подстановочных знаков - в качестве последующих аргументов. В этом примере мы используем заполнитель, чтобы указать, что часть «ID» имени канала является подстановочным знаком.{orderId}

Прослушивание трансляций событий

Далее осталось только прослушать событие в нашем приложении JavaScript. Мы можем сделать это, используя Laravel Echo. Сначала мы будем использовать privateметод для подписки на частный канал. Затем мы можем использовать listenметод для прослушивания ShippingStatusUpdatedсобытия. По умолчанию все общедоступные свойства события будут включены в событие трансляции:

Echo.private(`order.${orderId}`)
    .listen('ShippingStatusUpdated', (e) => {
        console.log(e.update);
    });

 

Определение трансляции событий

Чтобы сообщить Laravel о том, что данное событие должно быть передано, реализуйте интерфейс в классе событий. Этот интерфейс уже импортирован во все классы событий, сгенерированные платформой, поэтому вы можете легко добавить его к любому из ваших событий.Illuminate\Contracts\Broadcasting\ShouldBroadcast

ShouldBroadcastИнтерфейс требует , чтобы реализовать один метод: broadcastOnbroadcastOnМетод должен возвращать канал или массив каналов , что событие должно транслироваться на. Каналы должны быть экземплярами ChannelPrivateChannel, или PresenceChannel. Экземпляры Channelпредставляют публичные каналы, на которые может подписаться любой пользователь, PrivateChannelsи PresenceChannelsпредставляют частные каналы, которые требуют авторизации канала :

<?php

namespace App\Events;

use App\User;
use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

class ServerCreated implements ShouldBroadcast
{
    use SerializesModels;

    public $user;

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

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

Затем вам нужно только запустить событие, как обычно. Как только событие было запущено, задание в очереди автоматически транслирует событие через указанный вами драйвер вещания.

 

Название трансляции

По умолчанию Laravel будет транслировать событие, используя имя класса события. Однако вы можете настроить имя широковещания, определив broadcastAsметод для события:

/**
 * The event's broadcast name.
 *
 * @return string
 */
public function broadcastAs()
{
    return 'server.created';
}

Если вы настраиваете имя широковещательной рассылки, используя broadcastAsметод, вы должны обязательно зарегистрировать слушателя с ведущим .символом. Это заставит Echo не добавлять к имени события пространство приложения:

.listen('.server.created', function (e) {
    ....
});

 

Трансляция данных

Когда событие транслируется, все его publicсвойства автоматически сериализуются и транслируются как полезная нагрузка события, что позволяет вам получить доступ к любым его общедоступным данным из вашего приложения JavaScript. Так, например, если у вашего события есть одно открытое $userсвойство, которое содержит модель Eloquent, полезная нагрузка события будет:

{
    "user": {
        "id": 1,
        "name": "Patrick Stewart"
        ...
    }
}

Однако, если вы хотите иметь более детальный контроль над вашей вещательной полезной нагрузкой, вы можете добавить broadcastWithметод к вашему событию. Этот метод должен возвращать массив данных, которые вы хотите транслировать как полезную нагрузку события:

/**
 * Get the data to broadcast.
 *
 * @return array
 */
public function broadcastWith()
{
    return ['id' => $this->user->id];
}

 

Очередь трансляции

По умолчанию каждое широковещательное событие помещается в очередь по умолчанию для подключения к очереди по умолчанию, указанного в файле конфигурации. Вы можете настроить очередь, используемую вещателем, определив свойство в вашем классе событий. В этом свойстве должно быть указано имя очереди, которую вы хотите использовать при трансляции:queue.phpbroadcastQueue

/**
 * The name of the queue on which to place the event.
 *
 * @var string
 */
public $broadcastQueue = 'your-queue-name';

Если вы хотите транслировать ваше событие, используя syncочередь вместо драйвера очереди по умолчанию, вы можете реализовать ShouldBroadcastNowинтерфейс вместо ShouldBroadcast:

<?php

use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;

class ShippingStatusUpdated implements ShouldBroadcastNow
{
    //
}

 

Условия трансляции

Иногда вы хотите транслировать свое событие, только если данное условие выполняется. Вы можете определить эти условия, добавив broadcastWhenметод в ваш класс событий:

/**
 * Determine if this event should broadcast.
 *
 * @return bool
 */
public function broadcastWhen()
{
    return $this->value > 100;
}

 

Авторизация каналов

Частные каналы требуют авторизации, чтобы аутентифицированный в данный момент пользователь мог прослушивать канал. Это достигается путем отправки HTTP-запроса вашему приложению Laravel с именем канала и предоставления вашему приложению возможности определить, может ли пользователь прослушивать этот канал. При использовании Laravel EchoHTTP-запрос на авторизацию подписок на частные каналы будет сделан автоматически; однако вам необходимо определить правильные маршруты для ответа на эти запросы.

 

Определение маршрутов авторизации

К счастью, Laravel позволяет легко определять маршруты для ответа на запросы авторизации канала. В BroadcastServiceProviderкомплекте с приложением Laravel вы увидите вызов метода. Этот метод зарегистрирует маршрут для обработки запросов авторизации:Broadcast::routes/broadcasting/auth

Broadcast::routes();

Метод будет автоматически помещать свои маршруты в группе промежуточного программного обеспечения ; однако вы можете передать массив атрибутов маршрута методу, если хотите настроить назначенные атрибуты:Broadcast::routesweb

Broadcast::routes($attributes);

Настройка конечной точки авторизации

По умолчанию Echo будет использовать конечную точку для авторизации доступа к каналу. Однако вы можете указать свою собственную конечную точку авторизации, передав опцию конфигурации вашему экземпляру Echo:/broadcasting/authauthEndpoint

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: 'your-pusher-key',
    authEndpoint: '/custom/endpoint/auth'
});

 

Определение обратных вызовов авторизации

Далее нам нужно определить логику, которая фактически будет выполнять авторизацию канала. Это делается в файле, который включен в ваше приложение. В этом файле вы можете использовать метод для регистрации обратных вызовов авторизации канала:routes/channels.phpBroadcast::channel

Broadcast::channel('order.{orderId}', function ($user, $orderId) {
    return $user->id === Order::findOrNew($orderId)->user_id;
});

channelМетод принимает два аргумента: имя канала и обратный вызов , который возвращает trueили falseуказывающий, имеет ли пользователь право слушать на канале.

Все обратные вызовы авторизации получают аутентифицированного пользователя в качестве первого аргумента, а любые дополнительные параметры подстановочных знаков - в качестве последующих аргументов. В этом примере мы используем заполнитель, чтобы указать, что часть «ID» имени канала является подстановочным знаком.{orderId}

Привязка модели обратного вызова авторизации

Как и HTTP-маршруты, канальные маршруты могут также использовать неявную и явную привязку модели маршрута . Например, вместо получения строкового или числового идентификатора заказа, вы можете запросить фактический Orderэкземпляр модели:

use App\Order;

Broadcast::channel('order.{order}', function ($user, Order $order) {
    return $user->id === $order->user_id;
});

Авторизация Обратный звонок Аутентификация

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

Broadcast::channel('channel', function() {
    // ...
}, ['guards' => ['web', 'admin']])

 

Определение классов каналов

Если ваше приложение использует много разных каналов, ваш файл может стать громоздким. Таким образом, вместо использования Closures для авторизации каналов, вы можете использовать классы каналов. Чтобы создать класс канала, используйте команду Artisan. Эта команда поместит новый класс канала в каталог.routes/channels.phpmake:channelApp/Broadcasting

php artisan make:channel OrderChannel

Затем зарегистрируйте свой канал в своем файле:routes/channels.php

use App\Broadcasting\OrderChannel;

Broadcast::channel('order.{order}', OrderChannel::class);

Наконец, вы можете разместить логику авторизации для вашего канала в joinметоде класса канала . Этот joinметод будет содержать ту же логику, которую вы обычно размещали бы в своем закрытии авторизации канала. Вы также можете воспользоваться привязкой модели канала:

<?php

namespace App\Broadcasting;

use App\User;
use App\Order;

class OrderChannel
{
    /**
     * Create a new channel instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Authenticate the user's access to the channel.
     *
     * @param  \App\User  $user
     * @param  \App\Order  $order
     * @return array|bool
     */
    public function join(User $user, Order $order)
    {
        return $user->id === $order->user_id;
    }
}

Как и многие другие классы в Laravel, классы каналов будут автоматически разрешаться контейнером службы . Таким образом, вы можете напечатать любую подсказку, требуемую вашим каналом в его конструкторе.

 

Вещательные события

После того как вы определили событие и пометили его ShouldBroadcastинтерфейсом, вам нужно только запустить событие, используя eventфункцию. Диспетчер событий заметит, что событие помечено ShouldBroadcastинтерфейсом, и поставит его в очередь на трансляцию:

event(new ShippingStatusUpdated($update));

 

Только для других

При создании приложения, которое использует трансляцию событий, вы можете заменить eventфункцию на broadcastфункцию. Как и eventфункция, broadcastфункция отправляет событие вашим слушателям на стороне сервера:

broadcast(new ShippingStatusUpdated($update));

Однако broadcastфункция также предоставляет toOthersметод, который позволяет исключить текущего пользователя из получателей широковещательной рассылки:

broadcast(new ShippingStatusUpdated($update))->toOthers();

Чтобы лучше понять, когда вы захотите использовать toOthersметод, давайте представим приложение со списком задач, в котором пользователь может создать новую задачу, введя имя задачи. Чтобы создать задачу, ваше приложение может сделать запрос к /taskконечной точке, которая транслирует создание задачи и возвращает JSON-представление новой задачи. Когда ваше приложение JavaScript получает ответ от конечной точки, оно может напрямую вставить новую задачу в свой список задач следующим образом:

axios.post('/task', task)
    .then((response) => {
        this.tasks.push(response.data);
    });

Однако помните, что мы также транслировали создание задачи. Если ваше приложение JavaScript прослушивает это событие, чтобы добавить задачи в список задач, в вашем списке будут дубликаты задач: одна с конечной точки и одна из широковещательной рассылки. Вы можете решить эту проблему, используя toOthersметод, чтобы указать вещателю не транслировать событие текущему пользователю.

Ваше событие должно использовать черту, чтобы вызвать метод.Illuminate\Broadcasting\InteractsWithSocketstoOthers

Конфигурация

Когда вы инициализируете экземпляр Laravel Echo, идентификатору сокета назначается соединение. Если вы используете Vue и Axios , идентификатор сокета будет автоматически присоединяться к каждому исходящему запросу в качестве заголовка. Затем, когда вы вызываете метод, Laravel извлекает идентификатор сокета из заголовка и дает указание вещателю не транслировать никакие соединения с этим идентификатором сокета.X-Socket-IDtoOthers

Если вы не используете Vue и Axios, вам необходимо вручную настроить приложение JavaScript для отправки заголовка. Вы можете получить идентификатор сокета, используя метод:X-Socket-IDEcho.socketId

var socketId = Echo.socketId();

 

Получение трансляций

Установка Laravel Echo

Laravel Echo - это библиотека JavaScript, которая позволяет безболезненно подписываться на каналы и прослушивать события, транслируемые Laravel. Вы можете установить Echo через менеджер пакетов NPM. В этом примере мы также установим пакет, так как будем использовать вещатель Pusher:pusher-js

npm install --save laravel-echo pusher-js

После установки Echo вы готовы создать новый экземпляр Echo в JavaScript вашего приложения. Отличное место для этого - внизу файла, который включен в инфраструктуру Laravel:resources/js/bootstrap.js

import Echo from "laravel-echo"

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: 'your-pusher-key'
});

При создании экземпляра Echo, использующего pusherсоединитель, вы также можете указать, clusterа также следует ли шифровать соединение:

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: 'your-pusher-key',
    cluster: 'eu',
    encrypted: true
});

Использование существующего клиентского экземпляра

Если у вас уже есть экземпляр клиента Pusher или Socket.io, который вы хотите использовать в Echo, вы можете передать его в Echo с помощью параметра clientконфигурации:

const client = require('pusher-js');

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: 'your-pusher-key',
    client: client
});

 

Прослушивание событий

После того, как вы установили и создали экземпляр Echo, вы готовы начать прослушивание трансляций событий. Сначала используйте channelметод для извлечения экземпляра канала, затем вызовите listenметод для прослушивания указанного события:

Echo.channel('orders')
    .listen('OrderShipped', (e) => {
        console.log(e.order.name);
    });

Если вы хотите прослушивать события на частном канале, используйте privateвместо этого метод. Вы можете продолжить цепочку вызовов listenметода для прослушивания нескольких событий на одном канале:

Echo.private('orders')
    .listen(...)
    .listen(...)
    .listen(...);

 

Покидая канал

Чтобы покинуть канал, вы можете вызвать leaveChannelметод в вашем экземпляре Echo:

Echo.leaveChannel('orders');

Если вы хотите покинуть канал, а также связанные с ним частные каналы и каналы присутствия, вы можете вызвать leaveметод:

Echo.leave('orders');

 

Пространства имен

Возможно, вы заметили в приведенных выше примерах, что мы не указали полное пространство имен для классов событий. Это связано с тем, что Echo автоматически предполагает, что события находятся в пространстве имен. Однако вы можете настроить корневое пространство имен при создании экземпляра Echo, передав опцию конфигурации:App\Eventsnamespace

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: 'your-pusher-key',
    namespace: 'App.Other.Namespace'
});

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

Echo.channel('orders')
    .listen('.Namespace\\Event\\Class', (e) => {
        //
    });

 

Каналы присутствия

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

 

Авторизация каналов присутствия

Все каналы присутствия также являются частными каналами; следовательно, пользователи должны быть авторизованы для доступа к ним . Однако при определении обратных вызовов авторизации для каналов присутствия вы не вернетесь, trueесли пользователь авторизован для присоединения к каналу. Вместо этого вы должны вернуть массив данных о пользователе.

Данные, возвращаемые обратным вызовом авторизации, будут доступны слушателям событий канала присутствия в вашем приложении JavaScript. Если пользователь не авторизован для подключения к каналу присутствия, вы должны вернуться falseили null:

Broadcast::channel('chat.{roomId}', function ($user, $roomId) {
    if ($user->canJoinRoom($roomId)) {
        return ['id' => $user->id, 'name' => $user->name];
    }
});

 

Присоединение к каналам присутствия

Чтобы присоединиться к каналу присутствия, вы можете использовать joinметод Echo . joinМетод возвращает PresenceChannelреализацию , которая, наряду с обнажая listenметод, позволяет подписаться на herejoiningи leavingсобытия.

Echo.join(`chat.${roomId}`)
    .here((users) => {
        //
    })
    .joining((user) => {
        console.log(user.name);
    })
    .leaving((user) => {
        console.log(user.name);
    });

hereОбратного вызова будет выполняться сразу же после того , как канал успешно присоединился и получит массив , содержащий информацию о пользователе для всех других пользователей , в настоящее время подписался на канал. joiningМетод будет выполняться , когда новый пользователь присоединяется к каналу, в то время как leavingметод будет выполняться , когда пользователь покидает канал.

 

Вещание на каналы присутствия

Каналы присутствия могут получать события так же, как публичные или частные каналы. Используя пример чата, мы можем захотеть транслировать NewMessageсобытия на канал присутствия комнаты. Для этого мы вернем экземпляр из метода PresenceChannelсобытия broadcastOn:

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

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

broadcast(new NewMessage($message));

broadcast(new NewMessage($message))->toOthers();

Вы можете прослушать событие join методом Echo listen:

Echo.join(`chat.${roomId}`)
    .here(...)
    .joining(...)
    .leaving(...)
    .listen('NewMessage', (e) => {
        //
    });

 

События клиента

При использовании Pusher необходимо включить опцию «Клиентские события» в разделе «Настройки приложения» на панели инструментов вашего приложения , чтобы отправлять клиентские события.

Иногда вам может потребоваться передать событие другим подключенным клиентам, не обращаясь к вашему приложению Laravel вообще. Это может быть особенно полезно для таких вещей, как «печатание» уведомлений, когда вы хотите предупредить пользователей вашего приложения о том, что другой пользователь печатает сообщение на заданном экране.

Для трансляции клиентских событий вы можете использовать whisperметод Echo :

Echo.private('chat')
    .whisper('typing', {
        name: this.user.name
    });

Для прослушивания клиентских событий вы можете использовать listenForWhisperметод:

Echo.private('chat')
    .listenForWhisper('typing', (e) => {
        console.log(e.name);
    });

 

Уведомления

Сопрягая трансляцию событий с уведомлениями , ваше приложение JavaScript может получать новые уведомления по мере их появления без необходимости обновления страницы. Во-первых, обязательно ознакомьтесь с документацией по использованию канала оповещения о трансляции .

После того, как вы настроили уведомление для использования канала вещания, вы можете прослушивать события вещания, используя notificationметод Echo . Помните, что имя канала должно совпадать с именем класса объекта, получающего уведомления:

Echo.private(`App.User.${userId}`)
    .notification((notification) => {
        console.log(notification.type);
    });

В этом примере все уведомления, отправленные экземплярам через канал, будут получены обратным вызовом. Обратный вызов авторизации канала для канала включен в значение по умолчанию, которое поставляется с каркасом Laravel.App\UserbroadcastApp.User.{id}BroadcastServiceProvider