نسخه:

صدا و سیما

معرفی

در بسیاری از برنامه های کاربردی وب مدرن، WebSockets برای پیاده سازی بیدرنگ و به روز رسانی رابط های کاربری زنده استفاده می شود. هنگامی که برخی از داده ها در سرور به روز می شوند، معمولاً یک پیام از طریق یک اتصال WebSocket ارسال می شود تا توسط مشتری مدیریت شود. این یک جایگزین قوی تر و کارآمدتر برای نظرسنجی مداوم درخواست شما برای تغییرات فراهم می کند.

لاراول برای کمک به شما در ساخت این نوع برنامه‌ها، پخش رویدادهای شما را از طریق اتصال WebSocket آسان می‌کند. پخش رویدادهای لاراول به شما امکان می دهد نام رویدادهای مشابهی را بین کد سمت سرور و برنامه جاوا اسکریپت سمت کلاینت خود به اشتراک بگذارید.

قبل از غواصی در پخش رویداد، مطمئن شوید که تمام اسناد مربوط به رویدادهای لاراول و شنوندگان را خوانده اید .

پیکربندی

تمام پیکربندی پخش رویداد برنامه شما در config/broadcasting.php فایل پیکربندی ذخیره می شود. لاراول از چندین درایور پخش خارج از جعبه پشتیبانی می کند: Pusher Channels ، Redis ، و یک log درایور برای توسعه محلی و اشکال زدایی. علاوه بر این، یک null درایور گنجانده شده است که به شما امکان می دهد پخش را کاملاً غیرفعال کنید. یک مثال پیکربندی برای هر یک از این درایورها در config/broadcasting.php فایل پیکربندی گنجانده شده است.

ارائه دهنده خدمات پخش

قبل از پخش هر رویدادی، ابتدا باید ثبت نام کنید App\Providers\BroadcastServiceProvider . در برنامه های جدید لاراول، شما فقط باید این ارائه دهنده را در آرایه فایل پیکربندی providers خود حذف کنید. config/app.php این ارائه دهنده به شما امکان می دهد مسیرهای مجوز پخش و تماس های تماس را ثبت کنید.

توکن CSRF

Laravel Echo به توکن CSRF جلسه فعلی نیاز دارد. باید بررسی کنید که عنصر HTML برنامه شما head یک meta تگ حاوی توکن CSRF را تعریف می کند:

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

پیش نیاز راننده

کانال های فشار دهنده

اگر رویدادهای خود را از طریق Pusher Channels پخش می کنید ، باید Pusher Channels PHP SDK را با استفاده از مدیریت بسته Composer نصب کنید:

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

در مرحله بعد، باید اعتبار کانال های خود را در config/broadcasting.php فایل پیکربندی پیکربندی کنید. نمونه‌ای از پیکربندی کانال‌ها قبلاً در این فایل گنجانده شده است، که به شما امکان می‌دهد به سرعت کلید، رمز و شناسه برنامه کانال‌های خود را مشخص کنید. پیکربندی فایل همچنین به شما امکان می دهد موارد دیگری را که توسط کانال ها پشتیبانی می شوند، مانند خوشه مشخص کنید config/broadcasting.php : pusher options

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

هنگام استفاده از Channels و 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

سوکت های وب لاراول سازگار با Pusher

laravel -websockets یک بسته وب سوکت سازگار با PHP خالص برای لاراول است. این بسته به شما این امکان را می دهد تا از قدرت کامل پخش لاراول بدون ارائه دهنده وب سوکت خارجی یا Node استفاده کنید. برای اطلاعات بیشتر در مورد نصب و استفاده از این بسته، لطفاً به اسناد رسمی آن مراجعه کنید .

ردیس

اگر از پخش کننده 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 بار و کاربری که شناسه سوکت رویداد را ایجاد کرده است (در صورت وجود) خواهد بود.

سوکت.IO

اگر می خواهید پخش کننده Redis را با سرور Socket.IO جفت کنید، باید کتابخانه سرویس گیرنده جاوا اسکریپت Socket.IO را در برنامه خود قرار دهید. می توانید آن را از طریق مدیر بسته NPM نصب کنید:

npm install --save socket.io-client

در مرحله بعد، باید Echo را با 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 سازگار را اجرا کنید. لاراول شامل اجرای سرور Socket.IO نیست. با این حال، یک سرور Socket.IO مبتنی بر جامعه در حال حاضر در مخزن tlaverdure/laravel-echo-server GitHub نگهداری می شود.

پیش نیازهای صف

قبل از پخش رویدادها، همچنین باید یک شنونده صف را پیکربندی و اجرا کنید . تمام پخش رویدادها از طریق مشاغل در صف انجام می شود تا زمان پاسخگویی درخواست شما به طور جدی تحت تأثیر قرار نگیرد.

نمای کلی مفهوم

پخش رویداد لاراول به شما امکان می دهد رویدادهای لاراول سمت سرور خود را با استفاده از رویکرد مبتنی بر درایور به WebSockets در برنامه جاوا اسکریپت سمت کلاینت خود پخش کنید. در حال حاضر، لاراول با کانال‌های Pusher و درایورهای Redis عرضه می‌شود. رویدادها ممکن است به راحتی در سمت کلاینت با استفاده از بسته جاوا اسکریپت Laravel Echo مصرف شوند .

رویدادها از طریق "کانال ها" پخش می شوند، که ممکن است به عنوان عمومی یا خصوصی مشخص شوند. هر بازدید کننده از برنامه شما ممکن است بدون هیچ گونه احراز هویت یا مجوزی در یک کانال عمومی مشترک شود. با این حال، برای عضویت در یک کانال خصوصی، یک کاربر باید احراز هویت و مجاز به گوش دادن در آن کانال باشد.

اگر می خواهید از یک منبع باز و جایگزین Pusher مبتنی بر PHP استفاده کنید، بسته laravel-websockets را بررسی کنید .

استفاده از یک برنامه کاربردی

قبل از پرداختن به هر یک از اجزای پخش رویداد، بیایید با استفاده از یک فروشگاه تجارت الکترونیک به عنوان مثال، یک مرور کلی در سطح بالا داشته باشیم. ما در مورد جزئیات پیکربندی Pusher Channels یا Laravel Echo صحبت نخواهیم کرد زیرا در بخش‌های دیگر این مستندات به تفصیل مورد بحث قرار خواهد گرفت.

در برنامه ما، فرض کنید صفحه ای داریم که به کاربران امکان می دهد وضعیت حمل و نقل سفارش های خود را مشاهده کنند. بیایید همچنین فرض کنیم ShippingStatusUpdated زمانی که یک به‌روزرسانی وضعیت حمل و نقل توسط برنامه پردازش می‌شود، یک رویداد فعال می‌شود:

event(new ShippingStatusUpdated($update));

واسط ShouldBroadcast _

وقتی کاربر در حال مشاهده یکی از سفارش‌های خود است، نمی‌خواهیم برای مشاهده به‌روزرسانی‌های وضعیت، صفحه را به‌روزرسانی کند. درعوض، می‌خواهیم به‌روزرسانی‌ها را هنگام ایجاد برنامه، پخش کنیم. بنابراین، ما باید ShippingStatusUpdated رویداد را با ShouldBroadcast رابط علامت گذاری کنیم. این به لاراول دستور می‌دهد که این رویداد را هنگام اجرا پخش کند:

<?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 به رویداد ما برای تعریف یک 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 نشان می دهد که آیا کاربر مجاز به گوش دادن به کانال است.

همه فراخوان‌های مجوز، کاربر تأیید شده فعلی را به‌عنوان اولین آرگومان خود و هر پارامتر اضافی علامت‌های عام را به عنوان آرگومان‌های بعدی دریافت می‌کنند. در این مثال، ما از {orderId} مکان نگهدار برای نشان دادن اینکه بخش "ID" نام کانال یک علامت عام است استفاده می کنیم.

گوش دادن برای پخش رویداد

بعد، تنها چیزی که باقی می ماند گوش دادن به رویداد در برنامه جاوا اسکریپت است. ما می توانیم این کار را با استفاده از Laravel Echo انجام دهیم. private ابتدا از روشی برای عضویت در کانال خصوصی استفاده می کنیم . سپس، ممکن است از listen روش برای گوش دادن به ShippingStatusUpdated رویداد استفاده کنیم. به‌طور پیش‌فرض، همه ویژگی‌های عمومی رویداد در رویداد پخش گنجانده می‌شوند:

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

تعریف رویدادهای پخش

برای اطلاع دادن به لاراول که یک رویداد معین باید پخش شود، 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\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);
}
}

سپس، شما فقط باید رویداد را همانطور که معمولاً انجام می دهید فعال کنید. هنگامی که رویداد اخراج شد، یک کار در صف به طور خودکار رویداد را از طریق درایور پخش مشخص شده شما پخش می کند.

نام پخش

به طور پیش فرض، لاراول رویداد را با استفاده از نام کلاس رویداد پخش می کند. با این حال، می‌توانید نام پخش را با تعریف broadcastAs روشی در رویداد سفارشی کنید:

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

اگر نام پخش را با استفاده از این broadcastAs روش سفارشی کنید، باید مطمئن شوید که شنونده خود را با یک . کاراکتر پیشرو ثبت کنید. این به Echo دستور می دهد که فضای نام برنامه را به رویداد اضافه نکند:

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

داده های پخش

هنگامی که یک رویداد پخش می‌شود، تمام public ویژگی‌های آن به‌طور خودکار سریال‌سازی می‌شوند و به‌عنوان محموله رویداد پخش می‌شوند و به شما امکان می‌دهند به هر یک از داده‌های عمومی آن از برنامه جاوا اسکریپت خود دسترسی داشته باشید. بنابراین، برای مثال، اگر رویداد شما دارای یک $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 Echo ، درخواست HTTP برای مجاز کردن اشتراک در کانال های خصوصی به طور خودکار انجام می شود. با این حال، شما نیاز به تعریف مسیرهای مناسب برای پاسخ به این درخواست ها دارید.

تعریف مسیرهای مجوز

خوشبختانه، لاراول تعریف مسیرهای پاسخگویی به درخواست‌های مجوز کانال را آسان می‌کند. در BroadcastServiceProvider برنامه لاراول خود، فراخوانی به 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 یا false نشان می دهد که آیا کاربر مجاز به گوش دادن به کانال است.

همه فراخوان‌های مجوز، کاربر تأیید شده فعلی را به‌عنوان اولین آرگومان خود و هر پارامتر اضافی علامت‌های عام را به عنوان آرگومان‌های بعدی دریافت می‌کنند. در این مثال، ما از {orderId} مکان نگهدار برای نشان دادن اینکه بخش "ID" نام کانال یک علامت عام است استفاده می کنیم.

صحافی مدل بازگشت به تماس مجوز

درست مانند مسیرهای 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']]);

تعریف کلاس های کانال

اگر برنامه شما کانال های مختلفی را مصرف می کند، routes/channels.php فایل شما ممکن است حجیم شود. بنابراین، به جای استفاده از بسته شدن برای مجوز دادن به کانال ها، می توانید از کلاس های کانال استفاده کنید. برای ایجاد کلاس کانال، از make:channel دستور Artisan استفاده کنید. این دستور یک کلاس کانال جدید را در App/Broadcasting دایرکتوری قرار می دهد.

php artisan make:channel OrderChannel

سپس کانال خود را در routes/channels.php فایل خود ثبت کنید:

use App\Broadcasting\OrderChannel;
 
Broadcast::channel('order.{order}', OrderChannel::class);

در نهایت، می توانید منطق مجوز برای کانال خود را در join متد class channel قرار دهید. این join روش همان منطقی را در خود جای می دهد که معمولاً در بسته شدن مجوز کانال خود قرار می دادید. همچنین می‌توانید از اتصال مدل کانال استفاده کنید:

<?php
 
namespace App\Broadcasting;
 
use App\Order;
use App\User;
 
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;
}
}

مانند بسیاری از کلاس های دیگر در لاراول، کلاس های کانال به طور خودکار توسط کانتینر سرویس حل می شوند . بنابراین، می‌توانید هر وابستگی مورد نیاز کانال خود را در سازنده آن تایپ کنید.

رویدادهای پخش

هنگامی که یک رویداد را تعریف کردید و آن را با 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 از کار جدید را برمی گرداند. هنگامی که برنامه جاوا اسکریپت شما پاسخ را از نقطه پایانی دریافت می کند، ممکن است مستقیماً وظیفه جدید را در لیست وظایف خود قرار دهد مانند:

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

با این حال، به یاد داشته باشید که ما ایجاد وظیفه را نیز پخش کردیم. اگر برنامه جاوا اسکریپت شما در حال گوش دادن به این رویداد است تا وظایفی را به لیست کار اضافه کند، کارهای تکراری در لیست خود خواهید داشت: یکی از نقطه پایانی و دیگری از پخش. می‌توانید با استفاده از toOthers روشی که به پخش‌کننده دستور می‌دهد رویداد را برای کاربر فعلی پخش نکند، این مشکل را حل کنید.

رویداد شما باید از این Illuminate\Broadcasting\InteractsWithSockets ویژگی برای فراخوانی toOthers متد استفاده کند.

پیکربندی

هنگامی که یک نمونه Laravel Echo را مقداردهی اولیه می کنید، یک شناسه سوکت به اتصال اختصاص داده می شود. اگر از Vue و Axios استفاده می کنید ، شناسه سوکت به صورت خودکار به هر درخواست خروجی به عنوان X-Socket-ID سرصفحه متصل می شود. سپس، وقتی toOthers متد را فراخوانی می‌کنید، لاراول شناسه سوکت را از هدر استخراج می‌کند و به پخش‌کننده دستور می‌دهد که به هیچ اتصالی با آن شناسه سوکت پخش نشود.

اگر از Vue و Axios استفاده نمی کنید، باید به صورت دستی برنامه جاوا اسکریپت خود را برای ارسال X-Socket-ID هدر پیکربندی کنید. می توانید شناسه سوکت را با استفاده از Echo.socketId روش زیر بازیابی کنید:

var socketId = Echo.socketId();

دریافت پخش

نصب لاراول اکو

Laravel Echo یک کتابخانه جاوا اسکریپت است که اشتراک در کانال ها و گوش دادن به رویدادهای پخش شده توسط لاراول را بدون دردسر می کند. می توانید Echo را از طریق مدیر بسته NPM نصب کنید. در این مثال، ما pusher-js بسته را نیز نصب خواهیم کرد زیرا از پخش کننده Pusher Channels استفاده خواهیم کرد:

npm install --save laravel-echo pusher-js

پس از نصب Echo، آماده ایجاد یک نمونه Echo جدید در جاوا اسکریپت برنامه خود هستید. یک مکان عالی برای انجام این کار در پایین فایلی است resources/js/bootstrap.js که با چارچوب لاراول ارائه شده است:

import Echo from "laravel-echo"
 
window.Echo = new Echo({
broadcaster: 'pusher',
key: 'your-pusher-channels-key'
});

هنگام ایجاد یک نمونه Echo که از pusher کانکتور استفاده می کند، همچنین می توانید یک cluster و همچنین تعیین کنید که آیا اتصال باید از طریق TLS انجام شود (به طور پیش فرض، زمانی که forceTLS باشد false ، اگر صفحه از طریق HTTP بارگیری شده باشد، یک اتصال غیر TLS ایجاد می شود، یا اگر اتصال TLS از کار بیفتد، به عنوان یک بازگشت:

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

استفاده از یک نمونه مشتری موجود

اگر قبلاً یک نمونه مشتری Pusher Channels یا Socket.io دارید که می‌خواهید Echo از آن استفاده کند، می‌توانید آن را از طریق client گزینه پیکربندی به Echo ارسال کنید:

const client = require('pusher-js');
 
window.Echo = new Echo({
broadcaster: 'pusher',
key: 'your-pusher-channels-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 به طور خودکار فرض می کند که رویدادها در App\Events فضای نام قرار دارند. با این حال، هنگامی که Echo را نمونه‌سازی می‌کنید، می‌توانید با عبور از یک namespace گزینه پیکربندی، فضای نام ریشه را پیکربندی کنید:

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

از طرف دیگر، می‌توانید . هنگام اشتراک در کلاس‌های رویداد با استفاده از Echo، پیشوند آن‌ها را با a اضافه کنید. این به شما امکان می دهد همیشه نام کلاس کاملاً واجد شرایط را مشخص کنید:

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

کانال های حضور

کانال‌های حضور بر اساس امنیت کانال‌های خصوصی ساخته می‌شوند و در عین حال ویژگی اضافی آگاهی از افرادی که در کانال مشترک هستند را نشان می‌دهند. این کار ساختن ویژگی های قدرتمند و مشترک برنامه مانند اطلاع رسانی به کاربران در هنگام مشاهده یک کاربر دیگر را آسان می کند.

مجوز کانال های حضور

همه کانال های حضور نیز کانال های خصوصی هستند. بنابراین، کاربران باید مجوز دسترسی به آنها را داشته باشند . true با این حال، هنگام تعریف تماس‌های مجوز برای کانال‌های حضور، اگر کاربر مجاز به پیوستن به کانال باشد، دیگر باز نمی‌گردید . در عوض، باید آرایه ای از داده های مربوط به کاربر را برگردانید.

داده‌های بازگردانده شده توسط پاسخ تماس مجوز برای شنوندگان رویداد کانال حضور در برنامه جاوا اسکریپت شما در دسترس قرار می‌گیرد. اگر کاربر مجاز به پیوستن به کانال حضور نیست، باید برگردید false یا null :

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

پیوستن به کانال های حضور

برای پیوستن به یک کانال حضور، می توانید از روش اکو استفاده کنید join . این 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 Channels ، باید گزینه "رویدادهای مشتری" را در بخش "تنظیمات برنامه" داشبورد برنامه خود فعال کنید تا رویدادهای مشتری ارسال شود.

گاهی اوقات ممکن است بخواهید یک رویداد را برای سایر کلاینت های متصل پخش کنید بدون اینکه به برنامه لاراول خود ضربه بزنید. این می تواند به ویژه برای مواردی مانند اعلان های "تایپ کردن" مفید باشد، جایی که می خواهید به کاربران برنامه خود هشدار دهید که کاربر دیگری در حال تایپ پیام در یک صفحه خاص است.

برای پخش رویدادهای مشتری، می توانید از روش Echo استفاده کنید whisper :

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

برای گوش دادن به رویدادهای مشتری، می توانید از listenForWhisper روش زیر استفاده کنید:

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

اطلاعیه

با جفت کردن پخش رویداد با اعلان‌ها ، برنامه جاوا اسکریپت شما ممکن است اعلان‌های جدیدی را بدون نیاز به بازخوانی صفحه دریافت کند. ابتدا، حتماً اسناد مربوط به استفاده از کانال اعلان پخش را مطالعه کنید .

هنگامی که یک اعلان را برای استفاده از کانال پخش پیکربندی کردید، می توانید با استفاده از notification روش اکو به رویدادهای پخش گوش دهید. به یاد داشته باشید، نام کانال باید با نام کلاس نهاد دریافت کننده اعلان ها مطابقت داشته باشد:

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

در این مثال، تمام اعلان‌هایی که App\User از طریق کانال به نمونه‌ها ارسال می‌شوند broadcast ، با تماس پاسخ دریافت می‌شوند. یک فراخوان مجوز کانال برای App.User.{id} کانال در پیش فرضی BroadcastServiceProvider که با چارچوب لاراول ارسال می شود گنجانده شده است.