Мовлення
- Вступ
- Огляд концепції
- Визначення Broadcast подій
- Авторизація каналів
- Broadcast подій
- Отримання Broadcast
- Канали присутності(Presence)
- Події клієнта
- Notifications
Вступ
У багатьох сучасних веб-додатках WebSockets використовуються для реалізації в режимі реального часу оновлюваних користувацьких інтерфейсів. Коли деякі дані оновлюються на сервері, повідомлення, як правило, надсилається через з'єднання WebSocket для обробки клієнтом. Це забезпечує більш надійну та ефективну альтернативу постійному опитуванню вашої програми для внесення змін.
Щоб допомогти вам у створенні таких типів програм, Laravel полегшує "Broadcast" вашихподіїчерез з'єднання WebSocket. Broadcast подій Laravel дозволяє обмінюватися однаковими іменами подій між кодом на стороні сервера та вашим додатком JavaScript на стороні клієнта.
Перш ніж заглибитися в Broadcast подій, переконайтесь, що ви прочитали всю документацію щодо Laravelподії та Listeners.
Конфігурація
Усі конфігурації Broadcast подій вашої програми зберігаються вconfig/broadcasting.php
файл конфігурації. Laravel підтримує декілька драйверів мовлення:Канали штовхача,Редіс, і alog
драйвер для місцевого розвитку та Debug. Крім того, anull
включений драйвер, що дозволяє повністю відключити мовлення. Приклад конфігурації наведено для кожного з цих драйверів уconfig/broadcasting.php
файл конфігурації.
Постачальник послуг Broadcast
Перш ніж транслювати будь-які події, спочатку потрібно зареєструватиApp\Providers\BroadcastServiceProvider
. У нових програмах Laravel вам потрібно лише прокоментувати цього постачальника вproviders
масив вашогоconfig/app.php
файл конфігурації. Цей постачальник дозволить вам реєструвати маршрути авторизації мовлення та Callbacks.
Токен CSRF
Laravel Echoпотребуватиме доступу до маркера CSRF поточної сесії. Ви повинні перевірити, що ваша програмаhead
Елемент HTML визначає ameta
тег, що містить маркер CSRF:
<meta name="csrf-token" content="{{ csrf_token() }}">
Передумови драйвера
Канали Pusher
Якщо ви транслюєте свої подіїКанали штовхача, вам слід встановити PHP SDK Pusher Channels за допомогою менеджера пакетів Composer:
composer require pusher/pusher-php-server "~4.0"
Далі слід налаштувати облікові дані каналів уconfig/broadcasting.php
файл конфігурації. Приклад конфігурації каналів уже включений у цей файл, що дозволяє швидко вказати ключ, секрет та ідентифікатор програми.config/broadcasting.php
файлівpusher
конфігурація також дозволяє вказати додатковіoptions
які підтримуються Каналами, такими як кластер:
'options' => [
'cluster' => 'eu',
'useTLS' => true
],
При використанні каналів та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-channels-key'
});
Нарешті, вам потрібно буде змінити драйвер мовлення наpusher
у вашому.env
файл:
BROADCAST_DRIVER=pusher
Сумісні веб-розетки Laravel
laravel-websockets- це чистий пакет PHP, сумісний з Pusher, для Laravel. Цей пакет дозволяє використовувати всю потужність Broadcast Laravel без зовнішнього постачальника веб-сокетів або Node. Для отримання додаткової інформації щодо встановлення та використання цього пакету, будь ласка, зверніться до йогоofficial documentation.
Редіс
Якщо ви використовуєте мовник Redis, вам слід або встановити розширення phpredis PHP через PECL, або встановити бібліотеку Predis через Composer:
composer require predis/predis
Далі слід оновити драйвер мовлення доredis
у вашому.env
файл:
BROADCAST_DRIVER=redis
Телеканал Redis буде транслювати повідомлення за допомогою функції pub / sub Redis; однак вам потрібно буде з'єднати це з сервером WebSocket, який може отримувати повідомлення від Redis і транслювати їх на ваші канали WebSocket.
Коли мовник Redis опублікує подію, вона буде опублікована на вказаних назвах каналів події, а корисним навантаженням буде кодований JSON рядок, що містить назву події,data
корисне навантаження та користувача, який згенерував ідентифікатор сокета події (якщо застосовується).
Socket.IO
Якщо ви збираєтеся з'єднати мовника Redis із сервером Socket.IO, вам потрібно буде включити клієнтську бібліотеку Socket.IO у свою програму. Ви можете встановити його через менеджер пакунків NPM:
npm install --save-dev socket.io-client@2
Далі вам потрібно буде створити екземпляр Echo за допомогоюsocket.io
роз'єм та ahost
.
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, керований спільнотою, наразі підтримується наtlaverdure / laravel-echo-serverРепозиторій GitHub.
Передумови черги
Перед Broadcast подій вам також потрібно буде налаштувати та запустити aпрослуховувач черги. Усі Broadcast подій здійснюються через завдання в черзі, так що час відгуку вашої програми серйозно не позначається.
Огляд концепції
Broadcast подій Laravel дозволяє транслювати події Laravel на сервері до вашого додатку JavaScript на стороні клієнта, використовуючи підхід на основі драйверів до WebSockets. В даний час Laravel поставляється зКанали штовхачата драйвери Redis. Події можуть бути легко використані на стороні клієнта за допомогоюLaravel EchoПакет Javascript.
Події транслюються за "каналами", які можуть бути визначені як загальнодоступні чи приватні. Будь-який відвідувач вашої програми може підписатися на загальнодоступний канал без будь-якої автентифікації або дозволу; однак, щоб підписатися на приватний канал, користувач повинен пройти аутентифікацію та авторизуватися для Listening на цьому каналі.
Якщо ви хочете скористатися відкритим кодом, PHP-керованою альтернативою Pusher, перегляньтеlaravel-websocketsпакет.
Використання прикладу програми
Перш ніж заглибитися в кожен компонент Broadcast подій, давайте візьмемо огляд високого рівня, використовуючи приклад магазину електронної комерції. Ми не будемо обговорювати деталі налаштуванняКанали штовхачаабоLaravel Echoоскільки це буде детально обговорено в інших розділах цієї документації.
В нашому додатку, припустимо, у нас є сторінка, яка дозволяє користувачам переглядати статус доставки своїх замовлень. Припустимо також, що aShippingStatusUpdated
подія запускається, коли додаток обробляє оновлення статусу доставки:
event(new ShippingStatusUpdated($update));
ShouldBroadcast
Інтерфейс
Коли користувач переглядає одне із своїх замовлень, ми не хочемо, щоб йому потрібно було оновлювати сторінку, щоб переглянути оновлення стану. Натомість ми хочемо транслювати оновлення програми під час їх створення. Отже, нам потрібно позначитиShippingStatusUpdated
подія зShouldBroadcast
інтерфейс. Це дасть вказівку Laravel транслювати подію під час її запуску:
<?php
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Queue\SerializesModels;
class ShippingStatusUpdated implements ShouldBroadcast
{
/**
* Information about the shipping status update.
*
* @var string
*/
public $update;
}
ShouldBroadcast
інтерфейс вимагає, щоб наша подія визначила abroadcastOn
метод. Цей метод відповідає за повернення каналів, на яких має транслюватись подія. Порожній заглушка цього методу вже визначена для сформованих класів подій, тому нам потрібно лише заповнити його деталі. Ми хочемо, щоб творець замовлення мав можливість переглядати оновлення стану, тому ми транслюватимемо подію на приватному каналі, пов’язаному із замовленням:
/**
* Get the channels the event should broadcast on.
*
* @return \Illuminate\Broadcasting\PrivateChannel
*/
public function broadcastOn()
{
return new PrivateChannel('order.'.$this->update->order_id);
}
Авторизація каналів
Пам’ятайте, користувачі повинні мати дозвіл на Listening на приватних каналах. Ми можемо визначити наші правила авторизації каналу вroutes/channels.php
файл. У цьому прикладі нам потрібно підтвердити, що будь-який користувач, який намагається прослуховувати приватний звукorder.1
канал насправді є творцем замовлення:
Broadcast::channel('order.{orderId}', function ($user, $orderId) {
return $user->id === Order::findOrNew($orderId)->user_id;
});
channel
Метод приймає два аргументи: назву каналу та зворотний виклик, який повертаєтьсяtrue
абоfalse
вказує, чи дозволено користувачеві прослуховувати канал.
Усі зворотні виклики авторизації отримують поточно автентифікованого користувача як перший аргумент, а будь-які додаткові параметри підстановки - як наступні аргументи. У цьому прикладі ми використовуємо{orderId}
заповнювач, щоб вказати, що частина «Ідентифікатор» назви каналу є символом підстановки.
Listening Broadcast подій
Далі, залишається лише прослухати подію в нашому додатку JavaScript. Ми можемо зробити це за допомогою Laravel Echo. Спочатку ми використаємоprivate
спосіб підписатися на приватний канал. Тоді ми можемо використовуватиlisten
метод ListeningShippingStatusUpdated
подія. За замовчуванням усі загальнодоступні властивості події будуть включені до Broadcast події:
Echo.private(`order.${orderId}`)
.listen('ShippingStatusUpdated', (e) => {
console.log(e.update);
});
Визначення Broadcast подій
Щоб повідомити Laravel про те, що дана подія має транслюватися, застосуйтеIlluminate\Contracts\Broadcasting\ShouldBroadcast
інтерфейс класу подій. Цей інтерфейс вже імпортований до всіх класів подій, створених фреймворком, тому ви можете легко додати його до будь-якої з ваших подій.
ShouldBroadcast
інтерфейс вимагає реалізації одного методу:broadcastOn
.broadcastOn
метод повинен повертати канал або масив каналів, на яких подія повинна транслювати. Канали мають бути екземплярамиChannel
,PrivateChannel
, абоPresenceChannel
. ЕкземпляриChannel
представляти загальнодоступні канали, на які може підписатися будь-який користувачPrivateChannels
іPresenceChannels
представляють приватні канали, які вимагаютьавторизація каналу:
<?php
namespace App\Events;
use App\Models\User;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Queue\SerializesModels;
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);
}
}
Тоді вам потрібно лишезвільнити подіюяк зазвичай. Як тільки подію було звільнено, aробота в черзіавтоматично транслюватиме подію за вказаним драйвером мовлення.
Назва Broadcast
За замовчуванням Laravel транслюватиме подію, використовуючи назву класу події. Однак ви можете налаштувати назву Broadcast, вказавши abroadcastAs
метод події:
/**
* The event's broadcast name.
*
* @return string
*/
public function broadcastAs()
{
return 'server.created';
}
Якщо ви налаштовуєте назву Broadcast за допомогоюbroadcastAs
методу, ви повинні переконатись, що зареєстрували свого Listenerа у ведучому.
характер. Це дозволить Echo не додавати простір імен програми до події:
.listen('.server.created', function (e) {
....
});
B Roa d або st
Коли Broadcast події, усі її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];
}
Черга Broadcast
За замовчуванням кожна Broadcast події розміщується в черзі за замовчуванням для з'єднання черги за замовчуванням, зазначеного у вашомуqueue.php
файл конфігурації. Ви можете налаштувати чергу, що використовується мовником, визначивши abroadcastQueue
властивість вашого класу подій. У цій властивості повинно бути вказано назву черги, яку ви хочете використовувати під час Broadcast:
/**
* 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
{
//
}
Умови мовлення
Іноді ви хочете транслювати свою подію, лише якщо задана умова відповідає дійсності. Ви можете визначити ці умови, додавши abroadcastWhen
метод до вашого класу подій:
/**
* Determine if this event should broadcast.
*
* @return bool
*/
public function broadcastWhen()
{
return $this->value > 100;
}
Авторизація каналів
Приватні канали вимагають від вас дозволу на те, що поточно зареєстрований користувач може насправді слухати канал. Це досягається шляхом надсилання HTTP-запиту до вашої програми Laravel з назвою каналу та надання можливості додатку визначити, чи може користувач слухати на цьому каналі. При використанніLaravel Echo, запит HTTP про авторизацію підписки на приватні канали буде зроблений автоматично; однак вам потрібно визначити правильні маршрути, щоб відповісти на ці запити.
Визначення шляхів авторизації
На щастя, Laravel дозволяє легко визначити маршрути для відповіді на запити авторизації каналу. ВBroadcastServiceProvider
включений до вашої програми Laravel, ви побачите дзвінок доBroadcast::routes
метод. Цей метод реєструє/broadcasting/auth
маршрут для обробки запитів на авторизацію:
Broadcast::routes();
Broadcast::routes
метод автоматично розмістить свої маршрути в межахweb
група проміжного програмного забезпечення; однак ви можете передати методу масив атрибутів маршруту, якщо хочете налаштувати призначені атрибути:
Broadcast::routes($attributes);
Налаштування кінцевої точки авторизації
За замовчуванням Echo використовуватиме/broadcasting/auth
кінцева точка для авторизації доступу до каналу. Однак ви можете вказати власну кінцеву точку авторизації, передавшиauthEndpoint
параметр конфігурації для вашого екземпляра Echo:
window.Echo = new Echo({
broadcaster: 'pusher',
key: 'your-pusher-channels-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
or false
вказує, чи дозволено користувачеві прослуховувати канал.
Усі зворотні виклики авторизації отримують поточно автентифікованого користувача як перший аргумент, а будь-які додаткові параметри підстановки - як наступні аргументи. У цьому прикладі ми використовуємо{orderId}
заповнювач, щоб вказати, що частина «Ідентифікатор» назви каналу є символом підстановки.
Прив'язка моделі авторизації зворотного виклику
Подібно до HTTP-маршрутів, маршрути каналів також можуть використовувати неявні та явніroute model binding. Наприклад, замість отримання рядка або ідентифікатора числового замовлення ви можете попросити фактичнийOrder
примірник моделі:
use App\Models\Order;
Broadcast::channel('order.{order}', function ($user, Order $order) {
return $user->id === $order->user_id;
});
Авторизація Аутентифікація зворотного дзвінка
Приватні канали та канали мовної присутності автентифікують поточного користувача через захист автентифікації вашого додатка за замовчуванням. Якщо користувач не аутентифікований, авторизація каналу автоматично відмовляється, а зворотний виклик авторизації ніколи не виконується. Однак ви можете призначити декілька спеціальних охоронців, які за необхідності мають автентифікувати вхідний запит:
Broadcast::channel('channel', function () {
// ...
}, ['guards' => ['web', 'admin']]);
Визначення класів каналів
Якщо ваша програма використовує багато різних каналів, вашroutes/channels.php
файл може стати громіздким. Отже, замість використання Closures для авторизації каналів, ви можете використовувати класи каналів. Щоб створити клас каналу, використовуйтеmake:channel
artisan командування. Ця команда помістить новий клас каналу в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\Models\Order;
use App\Models\User;
class OrderChannel
{
/**
* Create a new channel instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Authenticate the user's access to the channel.
*
* @param \App\Models\User $user
* @param \App\Models\Order $order
* @return array|bool
*/
public function join(User $user, Order $order)
{
return $user->id === $order->user_id;
}
}
Як і багато інших класів у Laravel, класи каналів автоматично визначаютьсяслужбовий контейнер. Отже, ви можете ввести в конструктор будь-які залежності, потрібні вашому каналу.
Broadcast подій
Визначивши подію та позначивши її значкомShouldBroadcast
інтерфейсу, вам потрібно активувати подію лише за допомогоюevent
функція. Диспетчер подій помітить, що подія позначена значкомShouldBroadcast
інтерфейс і поставить у чергу подію для Broadcast:
event(new ShippingStatusUpdated($update));
Тільки іншим
Створюючи додаток, що використовує Broadcast подій, ви можете замінитиevent
функція за допомогоюbroadcast
функція. Подобаєтьсяevent
функція,broadcast
функція передає подію вашим серверним Listenerам:
broadcast(new ShippingStatusUpdated($update));
Однак,broadcast
функція також виставляєtoOthers
метод, який дозволяє виключити поточного користувача з одержувачів Broadcast:
broadcast(new ShippingStatusUpdated($update))->toOthers();
Щоб краще зрозуміти, коли вам може знадобитися використовуватиtoOthers
, уявімо собі програму списку завдань, де користувач може створити нове завдання, ввівши ім’я завдання. Щоб створити завдання, ваша програма може зробити запит до/task
кінцева точка, яка транслює створення завдання та повертає представлення JSON нового завдання. Коли ваша програма JavaScript отримує відповідь від кінцевої точки, вона може безпосередньо вставити нове завдання у свій список завдань так:
axios.post('/task', task)
.then((response) => {
this.tasks.push(response.data);
});
Однак пам’ятайте, що ми також транслювали створення завдання. Якщо ваша програма JavaScript прослуховує цю подію, щоб додати завдання до списку завдань, у вашому списку будуть повторювані завдання: одне з кінцевої точки та одне з Broadcast. Ви можете вирішити це за допомогоюtoOthers
метод вказівки мовнику не транслювати подію поточному користувачеві.
Ваша подія повинна використовуватиIlluminate\Broadcasting\InteractsWithSockets
риса для того, щоб викликатиtoOthers
метод.
Конфігурація
Коли ви ініціалізуєте екземпляр Laravel Echo, з'єднанню присвоюється ідентифікатор сокета. Якщо ви використовуєтеПереглянутиіАксіос, ідентифікатор сокета буде автоматично приєднаний до кожного вихідного запиту якX-Socket-ID
заголовок. Потім, коли ви телефонуєте наtoOthers
методу, Laravel витягне ідентифікатор сокета із заголовка та дасть вказівку мовнику не транслювати жодні з'єднання з цим ідентифікатором сокета.
Якщо ви не використовуєте Vue та Axios, вам доведеться вручну налаштувати свою програму JavaScript для надсиланняX-Socket-ID
заголовок. Ви можете отримати ідентифікатор сокета за допомогоюEcho.socketId
метод:
var socketId = Echo.socketId();
Отримання Broadcast
Встановлення Laravel Echo
Laravel Echo - це бібліотека JavaScript, яка робить безболісним підписку на канали та Listening подій, які транслює Laravel. Ви можете встановити Echo через менеджер пакунків NPM. У цьому прикладі ми також встановимоpusher-js
пакет, оскільки ми будемо використовувати мовник Pusher Channels:
npm install --save-dev laravel-echo pusher-js
Після встановлення Echo ви готові створити новий екземпляр Echo у JavaScript вашого додатка. Чудове місце для цього - внизуresources/js/bootstrap.js
файл, що входить до фреймворку Laravel:
import Echo from "laravel-echo"
window.Echo = new Echo({
broadcaster: 'pusher',
key: 'your-pusher-channels-key'
});
При створенні екземпляра Echo, який використовує файлpusher
Ви також можете вказати acluster
а також про те, чи потрібно з'єднання здійснювати через TLS (за замовчуванням, колиforceTLS
is false
, буде підключено не TLS-з'єднання, якщо сторінка була завантажена через HTTP, або як резервний варіант, якщо TLS-з'єднання не вдається):
window.Echo = new Echo({
broadcaster: 'pusher',
key: 'your-pusher-channels-key',
cluster: 'eu',
forceTLS: true
});
Використання існуючого екземпляра клієнта
Якщо у вас вже є екземпляр клієнта Pusher Channels або Socket.io, який ви хотіли б використовувати Echo, ви можете передати його Echo черезclient
варіант конфігурації:
const client = require('pusher-js');
window.Echo = new Echo({
broadcaster: 'pusher',
key: 'your-pusher-channels-key',
client: client
});
Listening подій
Після встановлення та створення екземпляра Echo ви готові розпочати Listening Broadcast подій. По-перше, використовуйтеchannel
метод отримати екземпляр каналу, а потім викликатиlisten
метод Listening вказаної події:
Echo.channel('orders')
.listen('OrderShipped', (e) => {
console.log(e.order.name);
});
Якщо ви хочете слухати події на приватному каналі, використовуйтеprivate
замість цього. Ви можете продовжувати ланцюгові дзвінки доlisten
метод Listening декількох подій на одному каналі:
Echo.private('orders')
.listen(...)
.listen(...)
.listen(...);
Вихід із каналу
Щоб залишити канал, ви можете зателефонувати доleaveChannel
у вашому екземплярі Echo:
Echo.leaveChannel('orders');
Якщо ви хочете залишити канал, а також пов'язані з ним приватні канали та канали присутності, ви можете зателефонувати за номеромleave
метод:
Echo.leave('orders');
Namespaces
Можливо, ви помітили у прикладах вище, що ми не вказали повний простір імен для класів подій. Це тому, що Echo автоматично припустить, що події знаходяться вApp\Events
простір імен. Однак ви можете налаштувати кореневий простір імен під час створення екземпляра Echo, передавши файлnamespace
варіант конфігурації:
window.Echo = new Echo({
broadcaster: 'pusher',
key: 'your-pusher-channels-key',
namespace: 'App.Other.Namespace'
});
Крім того, ви можете поставити префікс класів подій перед символом.
підписуючись на них за допомогою Echo. Це дозволить завжди вказувати повну назву класу:
Echo.channel('orders')
.listen('.Namespace\\Event\\Class', (e) => {
//
});
Канали присутності
Канали присутності базуються на безпеці приватних каналів, одночасно виявляючи додаткову функцію обізнаності про те, хто підписаний на канал. Це спрощує створення потужних спільних функцій додатків, таких як Notification користувачів, коли інший користувач переглядає ту саму сторінку.
Авторизація каналів присутності
Усі канали присутності також є приватними; тому користувачі повинні бутиуповноважений на доступ до них. Однак при визначенні зворотних викликів для каналів присутності ви не повернетесьtrue
якщо користувач уповноважений приєднуватися до каналу. Натомість вам слід повернути масив даних про користувача.
Дані, повернені авторизаційним зворотним викликом, будуть доступні Listenerам подій каналу присутності у вашому додатку JavaScript. Якщо користувач не має права приєднуватися до каналу присутності, вам слід повернутисяfalse
абоnull
:
Broadcast::channel('chat.{roomId}', function ($user, $roomId) {
if ($user->canJoinRoom($roomId)) {
return ['id' => $user->id, 'name' => $user->name];
}
});
Приєднання до каналів присутності
Щоб приєднатися до каналу присутності, ви можете використовувати Echo'sjoin
метод.join
метод поверне aPresenceChannel
реалізації, яка поряд з викриттям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
метод буде виконаний, коли користувач покине канал.
Broadcast на канали присутності
Канали присутності можуть приймати події подібно до державних або приватних каналів. На прикладі чату ми можемо захотіти транслювати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:
broadcast(new NewMessage($message));
broadcast(new NewMessage($message))->toOthers();
Ви можете прослухати подію приєднання через Echo'slisten
метод:
Echo.join(`chat.${roomId}`)
.here(...)
.joining(...)
.leaving(...)
.listen('NewMessage', (e) => {
//
});
Події клієнта
Під час використанняКанали штовхача, ви повинні ввімкнути опцію "Клієнтські події" у розділі "Налаштування програми" на вашомуінформаційна панель програмидля того, щоб надсилати події клієнта.
Іноді вам може знадобитися транслювати подію для інших підключених клієнтів, взагалі не натискаючи вашу програму Laravel. Це може бути особливо корисно для таких речей, як Notification про "набір тексту", коли ви хочете попередити користувачів своєї програми, що інший користувач вводить повідомлення на даному екрані.
Для Broadcast клієнтських подій ви можете використовувати Echo'swhisper
метод:
Echo.private('chat')
.whisper('typing', {
name: this.user.name
});
Для Listening подій клієнта ви можете використовуватиlistenForWhisper
метод:
Echo.private('chat')
.listenForWhisper('typing', (e) => {
console.log(e.name);
});
Повідомлення
З’єднавши Broadcast події зповідомлення, ваш додаток JavaScript може отримувати нові Notification в міру їх появи, не потребуючи оновлення сторінки. По-перше, обов’язково прочитайте документацію щодо використанняканал Notification про Broadcast.
Після того, як ви налаштували Notification для використання Broadcast каналу, ви можете слухати Broadcastні події за допомогою Echo'snotification
метод. Пам’ятайте, назва каналу повинна відповідати назві класу сутності, яка отримує Notification:
Echo.private(`App.Models.User.${userId}`)
.notification((notification) => {
console.log(notification.type);
});
У цьому прикладі всі Notification надіслані наApp\Models\User
екземпляри черезbroadcast
канал отримає зворотний дзвінок. Зворотний виклик авторизації каналу дляApp.Models.User.{id}
канал включений за замовчуваннямBroadcastServiceProvider
що поставляється з рамкою Laravel.