Вступление
Во многих современных веб-приложениях WebSockets используются для реализации обновляемых в реальном времени пользовательских интерфейсов. Когда некоторые данные обновляются на сервере, сообщение обычно отправляется через соединение WebSocket для обработки клиентом. Это обеспечивает более надежную и эффективную альтернативу постоянному опросу вашего приложения на предмет изменений.
Чтобы помочь вам в создании приложений такого типа, Laravel облегчает «трансляцию» ваших событий через соединение WebSocket. Трансляция ваших событий Laravel позволяет вам совместно использовать одни и те же имена событий между вашим серверным кодом и вашим клиентским JavaScript-приложением.
Прежде чем погрузиться в трансляцию событий, убедитесь, что вы прочитали всю документацию, касающуюся событий и слушателей Laravel .
Конфигурация
Все настройки трансляции событий вашего приложения хранятся в файле конфигурации. Laravel поддерживает сразу несколько драйверов широковещания: Pusher , Redis и драйвер для локальной разработки и отладки. Кроме того, в комплект поставки входит драйвер, позволяющий полностью отключить трансляцию. Пример конфигурации включен для каждого из этих драйверов в файле конфигурации.config/broadcasting.php
log
null
config/broadcasting.php
Поставщик услуг вещания
Прежде чем транслировать какие-либо события, вам необходимо сначала зарегистрировать . В свежих приложениях Laravel вам нужно только раскомментировать этого провайдера в массиве вашего файла конфигурации. Этот провайдер позволит вам регистрировать широковещательные маршруты авторизации и обратные вызовы.App\Providers\BroadcastServiceProvider
providers
config/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.php
config/broadcasting.php
pusher
options
'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.io
host
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.php
order.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
Интерфейс требует , чтобы реализовать один метод: broadcastOn
. broadcastOn
Метод должен возвращать канал или массив каналов , что событие должно транслироваться на. Каналы должны быть экземплярами Channel
, PrivateChannel
, или 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.php
broadcastQueue
/**
* 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::routes
web
Broadcast::routes($attributes);
Настройка конечной точки авторизации
По умолчанию Echo будет использовать конечную точку для авторизации доступа к каналу. Однако вы можете указать свою собственную конечную точку авторизации, передав опцию конфигурации вашему экземпляру Echo:/broadcasting/auth
authEndpoint
window.Echo = new Echo({
broadcaster: 'pusher',
key: 'your-pusher-key',
authEndpoint: '/custom/endpoint/auth'
});
Определение обратных вызовов авторизации
Далее нам нужно определить логику, которая фактически будет выполнять авторизацию канала. Это делается в файле, который включен в ваше приложение. В этом файле вы можете использовать метод для регистрации обратных вызовов авторизации канала:routes/channels.php
Broadcast::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.php
make:channel
App/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\InteractsWithSockets
toOthers
Конфигурация
Когда вы инициализируете экземпляр Laravel Echo, идентификатору сокета назначается соединение. Если вы используете Vue и Axios , идентификатор сокета будет автоматически присоединяться к каждому исходящему запросу в качестве заголовка. Затем, когда вы вызываете метод, Laravel извлекает идентификатор сокета из заголовка и дает указание вещателю не транслировать никакие соединения с этим идентификатором сокета.X-Socket-ID
toOthers
Если вы не используете Vue и Axios, вам необходимо вручную настроить приложение JavaScript для отправки заголовка. Вы можете получить идентификатор сокета, используя метод:X-Socket-ID
Echo.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\Events
namespace
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
метод, позволяет подписаться на here
, joining
и 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\User
broadcast
App.User.{id}
BroadcastServiceProvider
0 комментариев