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