صدا و سیما
- معرفی
- نصب سمت سرور
- نصب سمت مشتری
- نمای کلی مفهوم
- تعریف رویدادهای پخش
- مجوز کانال ها
- رویدادهای پخش
- دریافت پخش
- کانال های حضور
- پخش مدل
- رویدادهای مشتری
- اطلاعیه
معرفی
در بسیاری از برنامه های کاربردی وب مدرن، WebSockets برای پیاده سازی بیدرنگ و به روز رسانی رابط های کاربری زنده استفاده می شود. هنگامی که برخی از داده ها در سرور به روز می شوند، معمولاً یک پیام از طریق یک اتصال WebSocket ارسال می شود تا توسط مشتری مدیریت شود. WebSockets جایگزین کارآمدتری برای نظرسنجی مداوم سرور برنامه شما برای تغییرات دادهای است که باید در UI شما منعکس شود.
به عنوان مثال، تصور کنید برنامه شما می تواند داده های یک کاربر را به یک فایل CSV صادر کند و آن را برای او ایمیل کند. با این حال، ایجاد این فایل CSV چند دقیقه طول می کشد، بنابراین شما انتخاب می کنید CSV را در یک
کار در صف
ایجاد کرده و پست کنید . وقتی CSV ایجاد شد و برای کاربر پست شد، میتوانیم از پخش رویداد برای ارسال رویدادی استفاده کنیم
App\Events\UserDataExported
که توسط جاوا اسکریپت برنامه ما دریافت میشود. پس از دریافت رویداد، میتوانیم پیامی به کاربر نشان دهیم که CSV او برای او ایمیل شده است بدون اینکه نیازی به بازخوانی صفحه داشته باشد.
لاراول برای کمک به شما در ایجاد این نوع ویژگیها، پخش رویدادهای Laravel سمت سرور خود را از طریق اتصال WebSocket آسان میکند. پخش رویدادهای لاراول به شما این امکان را می دهد که نام رویدادها و داده های مشابهی را بین برنامه لاراول سمت سرور و برنامه جاوا اسکریپت سمت کلاینت خود به اشتراک بگذارید.
مفاهیم اصلی پشت پخش ساده هستند: کلاینتها به کانالهای نامگذاری شده در فرانتاند متصل میشوند، در حالی که برنامه لاراول شما رویدادها را برای این کانالها در قسمت پشتی پخش میکند. این رویدادها میتواند حاوی هر گونه داده اضافی باشد که میخواهید در دسترس قرار دهید.
درایورهای پشتیبانی شده
بهطور پیشفرض، لاراول شامل سه درایور پخش سمت سرور است که میتوانید از بین آنها انتخاب کنید: Laravel Reverb ، Pusher Channels و Ably .
قبل از غواصی در پخش رویداد، مطمئن شوید که اسناد لاراول در مورد رویدادها و شنوندگان را خوانده اید .
نصب سمت سرور
برای شروع استفاده از پخش رویداد لاراول، باید تنظیماتی را در برنامه لاراول انجام دهیم و همچنین چند بسته را نصب کنیم.
پخش رویداد توسط یک درایور پخش سمت سرور انجام می شود که رویدادهای Laravel شما را پخش می کند تا Laravel Echo (یک کتابخانه جاوا اسکریپت) بتواند آنها را در مشتری مرورگر دریافت کند. نگران نباشید - ما هر قسمت از مراحل نصب را گام به گام بررسی خواهیم کرد.
پیکربندی
تمام پیکربندی پخش رویداد برنامه شما در
config/broadcasting.php
فایل پیکربندی ذخیره می شود. لاراول از چندین درایور پخش خارج از جعبه پشتیبانی می کند:
Laravel Reverb
،
Pusher Channels
،
Ably
، و یک
log
درایور برای توسعه محلی و اشکال زدایی. علاوه بر این، یک
null
درایور گنجانده شده است که به شما امکان می دهد پخش را در طول آزمایش کاملاً غیرفعال کنید. یک مثال پیکربندی برای هر یک از این درایورها در
config/broadcasting.php
فایل پیکربندی گنجانده شده است.
نصب و راه اندازی
به طور پیش فرض، پخش در برنامه های جدید لاراول فعال نیست. می توانید با استفاده از
install:broadcasting
دستور Artisan پخش را فعال کنید:
php artisan install:broadcasting
این
install:broadcasting
دستور یک
routes/channels.php
فایل ایجاد می کند که در آن می توانید مسیرهای مجوز پخش برنامه و تماس های برگشتی را ثبت کنید.
پیکربندی صف
قبل از پخش هر رویدادی، ابتدا باید یک queue worker را پیکربندی و اجرا کنید . تمام پخش رویدادها از طریق مشاغل در صف انجام می شود تا زمان پاسخگویی برنامه شما تحت تأثیر رویدادهای در حال پخش قرار نگیرد.
ریورب
هنگام اجرای
install:broadcasting
دستور، از شما خواسته می شود که
Laravel Reverb را
نصب کنید . البته، می توانید Reverb را به صورت دستی با استفاده از مدیریت بسته Composer نیز نصب کنید. از آنجایی که Reverb در حال حاضر در مرحله بتا است، باید به طور صریح نسخه بتا را نصب کنید:
composer require laravel/reverb:@beta
پس از نصب بسته، می توانید دستور نصب Reverb را برای انتشار پیکربندی اجرا کنید، متغیرهای محیط مورد نیاز Reverb را اضافه کنید و پخش رویداد را در برنامه خود فعال کنید:
php artisan reverb:install
می توانید دستورالعمل های دقیق نصب و استفاده از Reverb را در مستندات Reverb بیابید .
کانال های فشار دهنده
اگر قصد دارید رویدادهای خود را با استفاده از Pusher Channels پخش کنید ، باید Pusher Channels PHP SDK را با استفاده از مدیریت بسته Composer نصب کنید:
composer require pusher/pusher-php-server
در مرحله بعد، باید اطلاعات کاربری Pusher Channels خود را در
config/broadcasting.php
فایل پیکربندی پیکربندی کنید. نمونهای از پیکربندی کانالهای Pusher قبلاً در این فایل گنجانده شده است که به شما امکان میدهد به سرعت کلید، رمز و شناسه برنامه خود را مشخص کنید. به طور معمول، شما باید اعتبار کانال های Pusher خود را در فایل برنامه خود پیکربندی کنید
.env
:
PUSHER_APP_ID="your-pusher-app-id"PUSHER_APP_KEY="your-pusher-key"PUSHER_APP_SECRET="your-pusher-secret"PUSHER_HOST=PUSHER_PORT=443PUSHER_SCHEME="https"PUSHER_APP_CLUSTER="mt1"
پیکربندی فایل همچنین به شما امکان
config/broadcasting.php
میدهد موارد دیگری
را که توسط کانالها پشتیبانی میشوند، مانند کلاستر
pusher
مشخص کنید .
options
سپس،
BROADCAST_CONNECTION
متغیر محیطی را
pusher
در فایل برنامه خود به صورت زیر تنظیم کنید
.env
:
BROADCAST_CONNECTION=pusher
در نهایت، شما آماده نصب و پیکربندی Laravel Echo هستید که رویدادهای پخش را در سمت مشتری دریافت می کند.
توانا
مستندات زیر نحوه استفاده از Ably در حالت "سازگاری Pusher" را مورد بحث قرار می دهد. با این حال، تیم Ably یک پخش کننده و کلاینت Echo را توصیه و نگهداری می کند که بتواند از قابلیت های منحصر به فرد ارائه شده توسط Ably استفاده کند. برای اطلاعات بیشتر در مورد استفاده از درایورهای نگهداری شده Ably، لطفاً به مستندات پخش Laravel Ably مراجعه کنید .
اگر قصد دارید رویدادهای خود را با استفاده از Ably پخش کنید ، باید Ably PHP SDK را با استفاده از مدیریت بسته Composer نصب کنید:
composer require ably/ably-php
در مرحله بعد، باید اعتبار Ably خود را در
config/broadcasting.php
فایل پیکربندی پیکربندی کنید. نمونه ای از پیکربندی Ably قبلاً در این فایل گنجانده شده است که به شما امکان می دهد کلید خود را به سرعت مشخص کنید. به طور معمول، این مقدار باید از طریق
ABLY_KEY
متغیر محیطی
تنظیم شود
:
ABLY_KEY=your-ably-key
سپس،
BROADCAST_CONNECTION
متغیر محیطی را
ably
در فایل برنامه خود به صورت زیر تنظیم کنید
.env
:
BROADCAST_CONNECTION=ably
در نهایت، شما آماده نصب و پیکربندی Laravel Echo هستید که رویدادهای پخش را در سمت مشتری دریافت می کند.
نصب سمت مشتری
ریورب
Laravel Echo
یک کتابخانه جاوا اسکریپت است که اشتراک در کانال ها و گوش دادن به رویدادهای پخش شده توسط درایور پخش سمت سرور را بدون دردسر می کند. می توانید Echo را از طریق مدیر بسته NPM نصب کنید. در این مثال، ما
pusher-js
بسته را نیز نصب می کنیم زیرا Reverb از پروتکل Pusher برای اشتراک ها، کانال ها و پیام های WebSocket استفاده می کند:
npm install --save-dev laravel-echo pusher-js
پس از نصب Echo، آماده ایجاد یک نمونه Echo جدید در جاوا اسکریپت برنامه خود هستید. یک مکان عالی برای انجام این کار در پایین فایلی است
resources/js/bootstrap.js
که با چارچوب لاراول ارائه شده است. بهطور پیشفرض، نمونهای از پیکربندی Echo قبلاً در این فایل گنجانده شده است - شما به سادگی باید آن را حذف کنید و
broadcaster
گزینه پیکربندی را بهروزرسانی کنید
reverb
:
import Echo from 'laravel-echo'; import Pusher from 'pusher-js';window.Pusher = Pusher; window.Echo = new Echo({ broadcaster: 'reverb', key: import.meta.env.VITE_REVERB_APP_KEY, wsHost: import.meta.env.VITE_REVERB_HOST, wsPort: import.meta.env.VITE_REVERB_PORT, wssPort: import.meta.env.VITE_REVERB_PORT, forceTLS: (import.meta.env.VITE_REVERB_SCHEME ?? 'https') === 'https', enabledTransports: ['ws', 'wss'],});
در مرحله بعد، باید دارایی های برنامه خود را کامپایل کنید:
npm run build
پخش کننده Laravel Echo
reverb
به laravel-echo نسخه 1.16.0+ نیاز دارد.
کانال های فشار دهنده
Laravel Echo
یک کتابخانه جاوا اسکریپت است که اشتراک در کانال ها و گوش دادن به رویدادهای پخش شده توسط درایور پخش سمت سرور را بدون دردسر می کند. Echo همچنین از
pusher-js
بسته NPM برای پیاده سازی پروتکل Pusher برای اشتراک ها، کانال ها و پیام های WebSocket استفاده می کند.
دستور
install:broadcasting
Artisan به طور خودکار بسته های
laravel-echo
and
pusher-js
را برای شما نصب می کند. با این حال، می توانید این بسته ها را به صورت دستی از طریق NPM نیز نصب کنید:
npm install --save-dev laravel-echo pusher-js
پس از نصب Echo، آماده ایجاد یک نمونه Echo جدید در جاوا اسکریپت برنامه خود هستید. دستور
install:broadcasting
یک فایل پیکربندی Echo در
resources/js/echo.js
; با این حال، پیکربندی پیش فرض در این فایل برای Laravel Reverb در نظر گرفته شده است. می توانید پیکربندی زیر را برای انتقال پیکربندی به Pusher کپی کنید:
import Echo from 'laravel-echo'; import Pusher from 'pusher-js';window.Pusher = Pusher; window.Echo = new Echo({ broadcaster: 'pusher', key: import.meta.env.VITE_PUSHER_APP_KEY, cluster: import.meta.env.VITE_PUSHER_APP_CLUSTER, forceTLS: true});
در مرحله بعد، باید مقادیر مناسب برای متغیرهای محیط Pusher را در
.env
فایل برنامه خود تعریف کنید. اگر این متغیرها از قبل در فایل شما وجود ندارند
.env
، باید آنها را اضافه کنید:
PUSHER_APP_ID="your-pusher-app-id"PUSHER_APP_KEY="your-pusher-key"PUSHER_APP_SECRET="your-pusher-secret"PUSHER_HOST=PUSHER_PORT=443PUSHER_SCHEME="https"PUSHER_APP_CLUSTER="mt1" VITE_APP_NAME="${APP_NAME}"VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"VITE_PUSHER_HOST="${PUSHER_HOST}"VITE_PUSHER_PORT="${PUSHER_PORT}"VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
هنگامی که پیکربندی Echo را بر اساس نیازهای برنامه خود تنظیم کردید، می توانید دارایی های برنامه خود را کامپایل کنید:
npm run build
برای کسب اطلاعات بیشتر درباره کامپایل دارایی های جاوا اسکریپت برنامه خود، لطفاً به مستندات موجود در Vite مراجعه کنید .
استفاده از یک نمونه مشتری موجود
اگر قبلاً یک نمونه مشتری از Pusher Channels از پیش پیکربندی شده دارید که میخواهید Echo از آن استفاده کند، میتوانید آن را از طریق
client
گزینه پیکربندی به Echo ارسال کنید:
import Echo from 'laravel-echo';import Pusher from 'pusher-js'; const options = { broadcaster: 'pusher', key: 'your-pusher-channels-key'} window.Echo = new Echo({ ...options, client: new Pusher(options.key, options)});
توانا
مستندات زیر نحوه استفاده از Ably در حالت "سازگاری Pusher" را مورد بحث قرار می دهد. با این حال، تیم Ably یک پخش کننده و کلاینت Echo را توصیه و نگهداری می کند که بتواند از قابلیت های منحصر به فرد ارائه شده توسط Ably استفاده کند. برای اطلاعات بیشتر در مورد استفاده از درایورهای نگهداری شده Ably، لطفاً به مستندات پخش Laravel Ably مراجعه کنید .
Laravel Echo
یک کتابخانه جاوا اسکریپت است که اشتراک در کانال ها و گوش دادن به رویدادهای پخش شده توسط درایور پخش سمت سرور را بدون دردسر می کند. Echo همچنین از
pusher-js
بسته NPM برای پیاده سازی پروتکل Pusher برای اشتراک ها، کانال ها و پیام های WebSocket استفاده می کند.
دستور
install:broadcasting
Artisan به طور خودکار بسته های
laravel-echo
and
pusher-js
را برای شما نصب می کند. با این حال، می توانید این بسته ها را به صورت دستی از طریق NPM نیز نصب کنید:
npm install --save-dev laravel-echo pusher-js
قبل از ادامه، باید پشتیبانی از پروتکل Pusher را در تنظیمات برنامه Ably خود فعال کنید. میتوانید این ویژگی را در بخش «تنظیمات آداپتور پروتکل» داشبورد تنظیمات برنامه Ably خود فعال کنید.
پس از نصب Echo، آماده ایجاد یک نمونه Echo جدید در جاوا اسکریپت برنامه خود هستید. دستور
install:broadcasting
یک فایل پیکربندی Echo در
resources/js/echo.js
; با این حال، پیکربندی پیش فرض در این فایل برای Laravel Reverb در نظر گرفته شده است. می توانید پیکربندی زیر را برای انتقال پیکربندی خود به Ably کپی کنید:
import Echo from 'laravel-echo'; import Pusher from 'pusher-js';window.Pusher = Pusher; window.Echo = new Echo({ broadcaster: 'pusher', key: import.meta.env.VITE_ABLY_PUBLIC_KEY, wsHost: 'realtime-pusher.ably.io', wsPort: 443, disableStats: true, encrypted: true,});
ممکن است متوجه شده باشید که پیکربندی Ably Echo ما به یک
VITE_ABLY_PUBLIC_KEY
متغیر محیطی ارجاع می دهد. مقدار این متغیر باید کلید عمومی Ably شما باشد. کلید عمومی شما بخشی از کلید Ably شما است که قبل از
:
کاراکتر قرار می گیرد.
هنگامی که پیکربندی اکو را بر اساس نیاز خود تنظیم کردید، می توانید دارایی های برنامه خود را کامپایل کنید:
npm run dev
برای کسب اطلاعات بیشتر درباره کامپایل دارایی های جاوا اسکریپت برنامه خود، لطفاً به مستندات موجود در Vite مراجعه کنید .
نمای کلی مفهوم
پخش رویداد لاراول به شما امکان می دهد رویدادهای لاراول سمت سرور خود را با استفاده از رویکرد مبتنی بر درایور به WebSockets در برنامه جاوا اسکریپت سمت کلاینت خود پخش کنید. در حال حاضر، لاراول با کانالهای Pusher و درایورهای Ably عرضه میشود . رویدادها ممکن است به راحتی در سمت کلاینت با استفاده از بسته جاوا اسکریپت Laravel Echo مصرف شوند .
رویدادها از طریق "کانال ها" پخش می شوند، که ممکن است به عنوان عمومی یا خصوصی مشخص شوند. هر بازدید کننده از برنامه شما ممکن است بدون هیچ گونه احراز هویت یا مجوزی در یک کانال عمومی مشترک شود. با این حال، برای عضویت در یک کانال خصوصی، یک کاربر باید احراز هویت و مجاز به گوش دادن در آن کانال باشد.
با استفاده از یک نمونه برنامه
قبل از پرداختن به هر یک از اجزای پخش رویداد، بیایید با استفاده از یک فروشگاه تجارت الکترونیک به عنوان مثال، یک مرور کلی در سطح بالا داشته باشیم.
در برنامه ما، فرض کنید صفحه ای داریم که به کاربران امکان می دهد وضعیت حمل و نقل سفارش های خود را مشاهده کنند. بیایید همچنین فرض کنیم که یک
OrderShipmentStatusUpdated
رویداد زمانی فعال می شود که به روز رسانی وضعیت حمل و نقل توسط برنامه پردازش می شود:
use App\Events\OrderShipmentStatusUpdated; OrderShipmentStatusUpdated::dispatch($order);
واسط
ShouldBroadcast
وقتی کاربر در حال مشاهده یکی از سفارشهای خود است، نمیخواهیم برای مشاهده بهروزرسانیهای وضعیت، صفحه را بهروزرسانی کند. درعوض، میخواهیم بهروزرسانیها را هنگام ایجاد برنامه، پخش کنیم. بنابراین، ما باید
OrderShipmentStatusUpdated
رویداد را با
ShouldBroadcast
رابط علامت گذاری کنیم. این به لاراول دستور میدهد که این رویداد را هنگام اجرا پخش کند:
<?php namespace App\Events; use App\Models\Order;use Illuminate\Broadcasting\Channel;use Illuminate\Broadcasting\InteractsWithSockets;use Illuminate\Broadcasting\PresenceChannel;use Illuminate\Contracts\Broadcasting\ShouldBroadcast;use Illuminate\Queue\SerializesModels; class OrderShipmentStatusUpdated implements ShouldBroadcast{ /** * The order instance. * * @var \App\Order */ public $order;}
اینترفیس
ShouldBroadcast
به رویداد ما برای تعریف یک
broadcastOn
متد نیاز دارد. این روش مسئول بازگرداندن کانال هایی است که رویداد باید در آنها پخش شود. یک مقاله خرد خالی از این متد قبلاً روی کلاسهای رویداد تولید شده تعریف شده است، بنابراین ما فقط باید جزئیات آن را پر کنیم. ما فقط میخواهیم که سازنده سفارش بتواند بهروزرسانیهای وضعیت را مشاهده کند، بنابراین رویداد را در یک کانال خصوصی که به سفارش مرتبط است پخش میکنیم:
use Illuminate\Broadcasting\Channel;use Illuminate\Broadcasting\PrivateChannel; /** * Get the channel the event should broadcast on. */public function broadcastOn(): Channel{ return new PrivateChannel('orders.'.$this->order->id);}
اگر میخواهید رویداد در چندین کانال پخش شود، میتوانید
array
به جای آن یک مورد را برگردانید:
use Illuminate\Broadcasting\PrivateChannel; /** * Get the channels the event should broadcast on. * * @return array<int, \Illuminate\Broadcasting\Channel> */public function broadcastOn(): array{ return [ new PrivateChannel('orders.'.$this->order->id), // ... ];}
مجوز کانال ها
به یاد داشته باشید، کاربران باید مجاز به گوش دادن در کانال های خصوصی باشند. ممکن است قوانین مجوز کانال خود را در فایل برنامه خود تعریف کنیم
routes/channels.php
. در این مثال، باید بررسی کنیم که هر کاربری که سعی در گوش دادن به
orders.1
کانال خصوصی دارد، در واقع خالق سفارش است:
use App\Models\Order;use App\Models\User; Broadcast::channel('orders.{orderId}', function (User $user, int $orderId) { return $user->id === Order::findOrNew($orderId)->user_id;});
این
channel
روش دو آرگومان را می پذیرد: نام کانال و یک فراخوان که برمی گردد
true
یا
false
نشان می دهد که آیا کاربر مجاز به گوش دادن به کانال است.
همه فراخوانهای مجوز، کاربر تأیید شده فعلی را بهعنوان اولین آرگومان خود و هر پارامتر اضافی علامتهای عام را به عنوان آرگومانهای بعدی دریافت میکنند. در این مثال، ما از
{orderId}
مکان نگهدار برای نشان دادن اینکه بخش "ID" نام کانال یک علامت عام است استفاده می کنیم.
گوش دادن به پخش رویداد
بعد، تنها چیزی که باقی می ماند گوش دادن به رویداد در برنامه جاوا اسکریپت است. ما می توانیم این کار را با استفاده از
Laravel Echo
انجام دهیم . ابتدا از
private
روشی برای عضویت در کانال خصوصی
استفاده می کنیم .
سپس، ممکن است از
listen
روش برای گوش دادن به
OrderShipmentStatusUpdated
رویداد استفاده کنیم. بهطور پیشفرض، همه ویژگیهای عمومی رویداد در رویداد پخش گنجانده میشوند:
Echo.private(`orders.${orderId}`) .listen('OrderShipmentStatusUpdated', (e) => { console.log(e.order); });
تعریف رویدادهای پخش
برای اطلاع دادن به لاراول که یک رویداد معین باید پخش شود، باید اینترفیس را
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; /** * Create a new event instance. */ public function __construct( public User $user, ) {} /** * Get the channels the event should broadcast on. * * @return array<int, \Illuminate\Broadcasting\Channel> */ public function broadcastOn(): array { return [ new PrivateChannel('user.'.$this->user->id), ]; }}
پس از اجرای
ShouldBroadcast
اینترفیس، فقط باید
رویداد را
همانطور که معمولاً انجام میدهید فعال کنید. هنگامی که رویداد فعال شد، یک
کار در صف
به طور خودکار رویداد را با استفاده از درایور پخش مشخص شده شما پخش می کند.
نام پخش
به طور پیش فرض، لاراول رویداد را با استفاده از نام کلاس رویداد پخش می کند. با این حال، میتوانید نام پخش را با تعریف
broadcastAs
روشی در رویداد سفارشی کنید:
/** * The event's broadcast name. */public function broadcastAs(): string{ 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<string, mixed> */public function broadcastWith(): array{ return ['id' => $this->user->id];}
صف پخش
به طور پیشفرض، هر رویداد پخش در صف پیشفرض برای اتصال صف پیشفرض مشخصشده در
queue.php
فایل پیکربندی شما قرار میگیرد. میتوانید اتصال صف و نام مورد استفاده توسط پخشکننده را با تعریف
connection
و
queue
ویژگیهای کلاس رویداد خود سفارشی کنید:
/** * The name of the queue connection to use when broadcasting the event. * * @var string */public $connection = 'redis'; /** * The name of the queue on which to place the broadcasting job. * * @var string */public $queue = 'default';
از طرف دیگر، میتوانید نام صف را با تعریف
broadcastQueue
روشی در رویداد خود سفارشی کنید:
/** * The name of the queue on which to place the broadcasting job. */public function broadcastQueue(): string{ return 'default';}
اگر میخواهید رویداد خود را با استفاده
sync
از صف به جای درایور صف پیشفرض پخش کنید، میتوانید این
ShouldBroadcastNow
رابط را به جای
ShouldBroadcast
:
<?php use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow; class OrderShipmentStatusUpdated implements ShouldBroadcastNow{ // ...}
شرایط پخش
گاهی اوقات می خواهید رویداد خود را تنها در صورتی پخش کنید که یک شرط معین درست باشد. می توانید این شرایط را با افزودن یک
broadcastWhen
متد به کلاس رویداد خود تعریف کنید:
/** * Determine if this event should broadcast. */public function broadcastWhen(): bool{ return $this->order->value > 100;}
تراکنش های پخش و پایگاه داده
هنگامی که رویدادهای پخش در تراکنش های پایگاه داده ارسال می شوند، ممکن است قبل از انجام تراکنش پایگاه داده توسط صف پردازش شوند. هنگامی که این اتفاق می افتد، هر به روز رسانی که در طول تراکنش پایگاه داده در مدل ها یا رکوردهای پایگاه داده انجام داده اید ممکن است هنوز در پایگاه داده منعکس نشود. علاوه بر این، هر مدل یا رکورد پایگاه داده ایجاد شده در تراکنش ممکن است در پایگاه داده وجود نداشته باشد. اگر رویداد شما به این مدل ها بستگی دارد، هنگام پردازش کاری که رویداد را پخش می کند، خطاهای غیرمنتظره ای رخ می دهد.
اگر گزینه پیکربندی اتصال صف شما
after_commit
روی تنظیم شده باشد
false
، همچنان ممکن است نشان دهید که یک رویداد پخش خاص باید پس از انجام تمام تراکنش های پایگاه داده باز با پیاده سازی
ShouldDispatchAfterCommit
رابط در کلاس رویداد، ارسال شود:
<?php namespace App\Events; use Illuminate\Contracts\Broadcasting\ShouldBroadcast;use Illuminate\Contracts\Events\ShouldDispatchAfterCommit;use Illuminate\Queue\SerializesModels; class ServerCreated implements ShouldBroadcast, ShouldDispatchAfterCommit{ use SerializesModels;}
برای کسب اطلاعات بیشتر در مورد کار در مورد این مسائل، لطفاً اسناد مربوط به مشاغل در صف و تراکنش های پایگاه داده را مرور کنید .
مجوز کانال ها
کانالهای خصوصی از شما میخواهند که اجازه دهید کاربر تأیید شده فعلی بتواند واقعاً به کانال گوش دهد. این کار با درخواست HTTP به برنامه لاراول شما با نام کانال انجام می شود و به برنامه شما اجازه می دهد تعیین کند که آیا کاربر می تواند در آن کانال گوش دهد یا خیر. هنگام استفاده از Laravel Echo ، درخواست HTTP برای مجاز کردن اشتراک در کانال های خصوصی به طور خودکار انجام می شود.
هنگامی که پخش فعال است، لاراول به طور خودکار
/broadcasting/auth
مسیر را برای رسیدگی به درخواست های مجوز ثبت می کند. مسیر
/broadcasting/auth
به طور خودکار در گروه میان افزار قرار می گیرد
web
.
تعریف تماس های مجوز
در مرحله بعد، ما باید منطقی را تعریف کنیم که در واقع تعیین می کند که آیا کاربر تأیید شده فعلی می تواند به یک کانال خاص گوش دهد یا خیر. این کار در
routes/channels.php
فایلی که توسط دستور Artisan ساخته شده انجام می شود
install:broadcasting
. در این فایل، میتوانید از
Broadcast::channel
روش ثبت تماسهای مجوز کانال استفاده کنید:
use App\Models\User; Broadcast::channel('orders.{orderId}', function (User $user, int $orderId) { return $user->id === Order::findOrNew($orderId)->user_id;});
این
channel
روش دو آرگومان را می پذیرد: نام کانال و یک فراخوان که برمی گردد
true
یا
false
نشان می دهد که آیا کاربر مجاز به گوش دادن به کانال است.
همه فراخوانهای مجوز، کاربر تأیید شده فعلی را بهعنوان اولین آرگومان خود و هر پارامتر اضافی علامتهای عام را به عنوان آرگومانهای بعدی دریافت میکنند. در این مثال، ما از
{orderId}
مکان نگهدار برای نشان دادن اینکه بخش "ID" نام کانال یک علامت عام است استفاده می کنیم.
با استفاده از دستور Artisan میتوانید فهرستی از تماسهای مجوز پخش برنامه خود را مشاهده کنید
channel:list
:
php artisan channel:list
صحافی مدل بازگشت به تماس مجوز
درست مانند مسیرهای HTTP، مسیرهای کانال نیز ممکن است از اتصال مدل مسیر
ضمنی و صریح استفاده کنند
. به عنوان مثال، به جای دریافت یک شناسه ترتیب رشته یا عددی، می توانید یک
Order
نمونه مدل واقعی درخواست کنید:
use App\Models\Order;use App\Models\User; Broadcast::channel('orders.{order}', function (User $user, Order $order) { return $user->id === $order->user_id;});
بر خلاف اتصال مدل مسیر HTTP، اتصال مدل کانال از محدوده خودکار اتصال مدل ضمنی پشتیبانی نمیکند . با این حال، این به ندرت مشکل ساز است، زیرا بیشتر کانال ها را می توان بر اساس کلید اصلی و منحصر به فرد یک مدل واحد تعیین کرد.
احراز هویت بازگشت به تماس مجوز
کانالهای پخش خصوصی و حضوری، کاربر فعلی را از طریق محافظ پیشفرض احراز هویت برنامه شما تأیید میکنند. اگر کاربر احراز هویت نشده باشد، مجوز کانال به طور خودکار رد می شود و تماس مجدد مجوز هرگز اجرا نمی شود. با این حال، می توانید چندین محافظ سفارشی اختصاص دهید که در صورت لزوم باید درخواست دریافتی را تأیید کنند:
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('orders.{order}', OrderChannel::class);
در نهایت، می توانید منطق مجوز برای کانال خود را در
join
متد class channel قرار دهید. این
join
روش همان منطقی را در خود جای می دهد که معمولاً در بسته شدن مجوز کانال خود قرار می دادید. همچنین میتوانید از اتصال مدل کانال استفاده کنید:
<?php namespace App\Broadcasting; use App\Models\Order;use App\Models\User; class OrderChannel{ /** * Create a new channel instance. */ public function __construct() { // ... } /** * Authenticate the user's access to the channel. */ public function join(User $user, Order $order): array|bool { return $user->id === $order->user_id; }}
مانند بسیاری از کلاس های دیگر در لاراول، کلاس های کانال به طور خودکار توسط کانتینر سرویس حل می شوند . بنابراین، میتوانید هر وابستگی مورد نیاز کانال خود را در سازنده آن تایپ کنید.
رویدادهای پخش
هنگامی که یک رویداد را تعریف کردید و آن را با
ShouldBroadcast
رابط علامت گذاری کردید، فقط باید رویداد را با استفاده از روش اعزام رویداد فعال کنید. توزیع کننده رویداد متوجه می شود که رویداد با
ShouldBroadcast
رابط علامت گذاری شده است و رویداد را برای پخش در صف قرار می دهد:
use App\Events\OrderShipmentStatusUpdated; OrderShipmentStatusUpdated::dispatch($order);
فقط به دیگران
هنگام ساختن برنامهای که از پخش رویداد استفاده میکند، ممکن است گاهی لازم باشد رویدادی را برای همه مشترکان یک کانال خاص به جز کاربر فعلی پخش کنید. شما می توانید این کار را با استفاده از
broadcast
کمک کننده و
toOthers
روش انجام دهید:
use App\Events\OrderShipmentStatusUpdated; broadcast(new OrderShipmentStatusUpdated($update))->toOthers();
برای درک بهتر زمانی که ممکن است بخواهید از این
toOthers
روش استفاده کنید، بیایید یک برنامه لیست کار را تصور کنیم که در آن کاربر ممکن است با وارد کردن نام کار، یک کار جدید ایجاد کند. برای ایجاد یک کار، برنامه شما ممکن است درخواستی به
/task
URL ارسال کند که ایجاد کار را پخش می کند و نمایش JSON از کار جدید را برمی گرداند. هنگامی که برنامه جاوا اسکریپت شما پاسخ را از نقطه پایانی دریافت می کند، ممکن است مستقیماً وظیفه جدید را در لیست وظایف خود قرار دهد مانند:
axios.post('/task', task) .then((response) => { this.tasks.push(response.data); });
با این حال، به یاد داشته باشید که ما ایجاد وظیفه را نیز پخش کردیم. اگر برنامه جاوا اسکریپت شما نیز در حال گوش دادن به این رویداد است تا وظایفی را به لیست کار اضافه کند، وظایف تکراری در لیست خود خواهید داشت: یکی از نقطه پایانی و دیگری از پخش. میتوانید با استفاده از
toOthers
روشی که به پخشکننده دستور میدهد رویداد را برای کاربر فعلی پخش نکند، این مشکل را حل کنید.
رویداد شما باید از این
Illuminate\Broadcasting\InteractsWithSockets
ویژگی برای فراخوانیtoOthers
متد استفاده کند.
پیکربندی
هنگامی که یک نمونه Laravel Echo را مقداردهی اولیه می کنید، یک شناسه سوکت به اتصال اختصاص داده می شود. اگر از یک نمونه جهانی
Axios
برای ایجاد درخواست های HTTP از برنامه جاوا اسکریپت خود استفاده می کنید
، شناسه سوکت به صورت خودکار به هر درخواست خروجی به عنوان
X-Socket-ID
سرصفحه متصل می شود. سپس، وقتی
toOthers
متد را فراخوانی میکنید، لاراول شناسه سوکت را از هدر استخراج میکند و به پخشکننده دستور میدهد که به هیچ اتصالی با آن شناسه سوکت پخش نشود.
اگر از نمونه جهانی Axios استفاده نمی کنید، باید برنامه جاوا اسکریپت خود را به صورت دستی پیکربندی کنید تا
X-Socket-ID
هدر را با تمام درخواست های خروجی ارسال کند. می توانید شناسه سوکت را با استفاده از
Echo.socketId
روش زیر بازیابی کنید:
var socketId = Echo.socketId();
سفارشی کردن اتصال
اگر برنامه شما با چندین اتصال پخش تعامل دارد و میخواهید رویدادی را با استفاده از پخشکنندهای غیر از پیشفرض خود پخش کنید، میتوانید با استفاده از این
via
روش مشخص کنید که کدام اتصال را به یک رویداد فشار دهید:
use App\Events\OrderShipmentStatusUpdated; broadcast(new OrderShipmentStatusUpdated($update))->via('pusher');
همچنین، میتوانید اتصال پخش رویداد را با فراخوانی
broadcastVia
متد در سازنده رویداد مشخص کنید. با این حال، قبل از انجام این کار، باید مطمئن شوید که کلاس رویداد از این
InteractsWithBroadcasting
ویژگی استفاده می کند:
<?php namespace App\Events; use Illuminate\Broadcasting\Channel;use Illuminate\Broadcasting\InteractsWithBroadcasting;use Illuminate\Broadcasting\InteractsWithSockets;use Illuminate\Broadcasting\PresenceChannel;use Illuminate\Broadcasting\PrivateChannel;use Illuminate\Contracts\Broadcasting\ShouldBroadcast;use Illuminate\Queue\SerializesModels; class OrderShipmentStatusUpdated implements ShouldBroadcast{ use InteractsWithBroadcasting; /** * Create a new event instance. */ public function __construct() { $this->broadcastVia('pusher'); }}
دریافت پخش
گوش دادن به رویدادها
هنگامی که Laravel Echo را نصب و نمونهسازی
کردید
، آماده شنیدن رویدادهایی هستید که از برنامه لاراول شما پخش میشوند. ابتدا از
channel
روش برای بازیابی یک نمونه از یک کانال استفاده کنید، سپس
listen
متد را برای گوش دادن به یک رویداد مشخص فراخوانی کنید:
Echo.channel(`orders.${this.order.id}`) .listen('OrderShipmentStatusUpdated', (e) => { console.log(e.order.name); });
اگر می خواهید رویدادها را در یک کانال خصوصی گوش دهید،
private
به جای آن از روش استفاده کنید. می توانید به زنجیره فراخوانی
listen
روش برای گوش دادن به چندین رویداد در یک کانال ادامه دهید:
Echo.private(`orders.${this.order.id}`) .listen(/* ... */) .listen(/* ... */) .listen(/* ... */);
گوش دادن به رویدادها را متوقف کنید
اگر میخواهید بدون
خروج از کانال،
گوش دادن به یک رویداد را متوقف کنید ، میتوانید از
stopListening
روش زیر استفاده کنید:
Echo.private(`orders.${this.order.id}`) .stopListening('OrderShipmentStatusUpdated')
ترک یک کانال
برای خروج از یک کانال، میتوانید
leaveChannel
روش موجود در نمونه Echo خود را فراخوانی کنید:
Echo.leaveChannel(`orders.${this.order.id}`);
اگر میخواهید یک کانال و همچنین کانالهای خصوصی و حضوری مرتبط با آن را ترک کنید، میتوانید
leave
روش زیر را فراخوانی کنید:
Echo.leave(`orders.${this.order.id}`);
فضاهای نام
App\Events
ممکن است در مثال های بالا متوجه شده باشید که ما فضای نام کاملی را برای کلاس های رویداد
مشخص نکرده ایم .
این به این دلیل است که Echo به طور خودکار فرض می کند که رویدادها در
App\Events
فضای نام قرار دارند. با این حال، زمانی که Echo را نمونهسازی میکنید، میتوانید با عبور از یک
namespace
گزینه پیکربندی، فضای نام ریشه را پیکربندی کنید:
window.Echo = new Echo({ broadcaster: 'pusher', // ... namespace: 'App.Other.Namespace'});
از طرف دیگر، میتوانید
.
هنگام اشتراک در کلاسهای رویداد با استفاده از Echo، پیشوند آنها را با a اضافه کنید. این به شما امکان می دهد همیشه نام کلاس کاملاً واجد شرایط را مشخص کنید:
Echo.channel('orders') .listen('.Namespace\\Event\\Class', (e) => { // ... });
کانال های حضور
کانالهای حضور بر اساس امنیت کانالهای خصوصی ساخته میشوند و در عین حال ویژگی اضافی آگاهی از افرادی که در کانال مشترک هستند را نشان میدهند. این کار ساختن ویژگیهای قدرتمند و مشترک برنامه را آسان میکند، مانند اطلاع دادن به کاربران هنگامی که کاربر دیگری در حال مشاهده همان صفحه است یا ساکنان یک اتاق چت را فهرست میکند.
مجوز کانال های حضور
همه کانال های حضور نیز کانال های خصوصی هستند. بنابراین، کاربران باید
مجوز دسترسی به آنها را
داشته باشند . با این حال، هنگام تعریف تماسهای مجوز برای کانالهای حضور،
true
اگر کاربر مجاز به پیوستن به کانال باشد، دیگر
باز نمیگردید .
در عوض، باید آرایه ای از داده های مربوط به کاربر را برگردانید.
دادههای بازگردانده شده توسط پاسخ تماس مجوز برای شنوندگان رویداد کانال حضور در برنامه جاوا اسکریپت شما در دسترس قرار میگیرد. اگر کاربر مجاز به پیوستن به کانال حضور نیست، باید برگردید
false
یا
null
:
use App\Models\User; Broadcast::channel('chat.{roomId}', function (User $user, int $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); }) .error((error) => { console.error(error); });
پس از پیوستن موفقیت آمیز به کانال، تماس
here
پاسخ بلافاصله اجرا می شود و آرایه ای حاوی اطلاعات کاربر برای همه کاربران دیگری که در حال حاضر در کانال مشترک هستند دریافت می کند. این
joining
متد زمانی اجرا می شود که یک کاربر جدید به یک کانال بپیوندد، در حالی که این
leaving
روش زمانی اجرا می شود که کاربر کانال را ترک کند. این
error
روش زمانی اجرا می شود که نقطه پایانی احراز هویت یک کد وضعیت HTTP غیر از 200 را برمی گرداند یا اگر در تجزیه JSON برگشتی مشکلی وجود داشته باشد.
پخش به کانال های حضوری
کانالهای حضور ممکن است رویدادها را درست مانند کانالهای عمومی یا خصوصی دریافت کنند. با استفاده از مثال یک اتاق گفتگو، ممکن است بخواهیم
NewMessage
رویدادها را در کانال حضور اتاق پخش کنیم. برای انجام این کار، نمونهای
PresenceChannel
از متد رویداد را
برمیگردانیم
broadcastOn
:
/** * Get the channels the event should broadcast on. * * @return array<int, \Illuminate\Broadcasting\Channel> */public function broadcastOn(): array{ return [ new PresenceChannel('chat.'.$this->message->room_id), ];}
مانند سایر رویدادها، میتوانید از
broadcast
راهنما و
toOthers
روش برای حذف کاربر فعلی از دریافت پخش استفاده کنید:
broadcast(new NewMessage($message)); broadcast(new NewMessage($message))->toOthers();
مانند سایر انواع رویدادها، میتوانید با استفاده از
listen
روش اکو به رویدادهایی که به کانالهای حضور ارسال میشوند گوش دهید:
Echo.join(`chat.${roomId}`) .here(/* ... */) .joining(/* ... */) .leaving(/* ... */) .listen('NewMessage', (e) => { // ... });
پخش مدل
قبل از مطالعه مستندات زیر در مورد پخش مدل، توصیه می کنیم با مفاهیم کلی سرویس های پخش مدل لاراول و همچنین نحوه ایجاد دستی و گوش دادن به رویدادهای پخش آشنا شوید.
زمانی که مدلهای Eloquent
برنامه شما ایجاد، بهروزرسانی یا حذف میشوند،
پخش رویدادها معمول است .
البته، با
تعریف دستی رویدادهای سفارشی برای تغییرات حالت مدل Eloquent
و علامت گذاری آن رویدادها با
ShouldBroadcast
رابط، می توان این کار را به راحتی انجام داد.
با این حال، اگر از این رویدادها برای اهداف دیگری در برنامه خود استفاده نمی کنید، ایجاد کلاس های رویداد تنها با هدف پخش آنها می تواند دشوار باشد. برای رفع این مشکل، لاراول به شما اجازه می دهد تا نشان دهید که یک مدل Eloquent باید به طور خودکار تغییرات حالت خود را پخش کند.
برای شروع، مدل Eloquent شما باید از این
Illuminate\Database\Eloquent\BroadcastsEvents
ویژگی استفاده کند. علاوه بر این، مدل باید
broadcastOn
روشی را تعریف کند که آرایهای از کانالها را برمیگرداند که رویدادهای مدل باید در آنها پخش شوند:
<?php namespace App\Models; use Illuminate\Broadcasting\Channel;use Illuminate\Broadcasting\PrivateChannel;use Illuminate\Database\Eloquent\BroadcastsEvents;use Illuminate\Database\Eloquent\Factories\HasFactory;use Illuminate\Database\Eloquent\Model;use Illuminate\Database\Eloquent\Relations\BelongsTo; class Post extends Model{ use BroadcastsEvents, HasFactory; /** * Get the user that the post belongs to. */ public function user(): BelongsTo { return $this->belongsTo(User::class); } /** * Get the channels that model events should broadcast on. * * @return array<int, \Illuminate\Broadcasting\Channel|\Illuminate\Database\Eloquent\Model> */ public function broadcastOn(string $event): array { return [$this, $this->user]; }}
هنگامی که مدل شما این ویژگی را شامل میشود و کانالهای پخش خود را تعریف میکند، زمانی که یک نمونه مدل ایجاد، بهروزرسانی، حذف، حذفشده یا بازیابی میشود، بهطور خودکار رویدادها را پخش میکند.
علاوه بر این، ممکن است متوجه شده باشید که
broadcastOn
متد یک
$event
آرگومان رشته ای دریافت می کند. این آرگومان شامل نوع رویدادی است که در مدل رخ داده است و دارای مقدار
created
,
updated
,
deleted
,
trashed
یا
restored
. با بررسی مقدار این متغیر، می توانید تعیین کنید که مدل برای یک رویداد خاص به کدام کانال ها (در صورت وجود) باید پخش شود:
/** * Get the channels that model events should broadcast on. * * @return array<string, array<int, \Illuminate\Broadcasting\Channel|\Illuminate\Database\Eloquent\Model>> */public function broadcastOn(string $event): array{ return match ($event) { 'deleted' => [], default => [$this, $this->user], };}
سفارشی سازی ایجاد رویداد پخش مدل
گاهی اوقات، ممکن است بخواهید نحوه ایجاد رویداد پخش مدل اصلی را لاراول سفارشی کنید. شما می توانید این کار را با تعریف
newBroadcastableEvent
روشی در مدل Eloquent خود انجام دهید. این متد باید یک
Illuminate\Database\Eloquent\BroadcastableModelEventOccurred
نمونه
برگرداند :
use Illuminate\Database\Eloquent\BroadcastableModelEventOccurred; /** * Create a new broadcastable model event for the model. */protected function newBroadcastableEvent(string $event): BroadcastableModelEventOccurred{ return (new BroadcastableModelEventOccurred( $this, $event ))->dontBroadcastToCurrentUser();}
مدل کنوانسیون های پخش
کنوانسیون های کانال
همانطور که ممکن است متوجه شده باشید،
broadcastOn
متد در مثال مدل بالا نمونه هایی را بر نمی گرداند
Channel
. در عوض، مدلهای Eloquent مستقیماً برگردانده شدند. اگر یک نمونه مدل Eloquent با متد مدل شما برگردانده شود
broadcastOn
(یا در آرایه ای وجود داشته باشد که توسط متد برگردانده شده است)، لاراول به طور خودکار یک نمونه کانال خصوصی را برای مدل با استفاده از نام کلاس مدل و شناسه کلید اصلی به عنوان نام کانال نمونه سازی می کند.
بنابراین، یک
App\Models\User
مدل با یک
id
از به
نمونه ای با نام
1
تبدیل می شود
. البته، علاوه بر برگرداندن نمونه های مدل Eloquent از
متد مدل خود، می توانید
نمونه های کاملی را برگردانید تا کنترل کاملی بر نام کانال های مدل داشته باشید:
Illuminate\Broadcasting\PrivateChannel
App.Models.User.1
broadcastOn
Channel
use Illuminate\Broadcasting\PrivateChannel; /** * Get the channels that model events should broadcast on. * * @return array<int, \Illuminate\Broadcasting\Channel> */public function broadcastOn(string $event): array{ return [ new PrivateChannel('user.'.$this->id) ];}
اگر قصد دارید به صراحت یک نمونه کانال را از متد مدل خود برگردانید
broadcastOn
، می توانید یک نمونه مدل Eloquent را به سازنده کانال ارسال کنید. هنگام انجام این کار، لاراول از قراردادهای کانال مدل مورد بحث در بالا برای تبدیل مدل Eloquent به رشته نام کانال استفاده می کند:
return [new Channel($this->user)];
اگر نیاز به تعیین نام کانال یک مدل دارید، می توانید
broadcastChannel
روش را در هر نمونه مدلی فراخوانی کنید. به عنوان مثال، این متد رشته
App.Models.User.1
یک
App\Models\User
مدل را با یک
id
از
1
:
$user->broadcastChannel()
کنوانسیون های رویداد
از آنجایی که رویدادهای پخش مدل با یک رویداد "واقعی" در فهرست برنامه شما مرتبط نیستند
App\Events
، بر اساس قراردادها یک نام و یک بار به آنها اختصاص داده می شود. قرارداد لاراول این است که رویداد را با استفاده از نام کلاس مدل (بدون احتساب فضای نام) و نام رویداد مدلی که پخش را آغاز کرده است، پخش کند.
بنابراین، برای مثال، بهروزرسانی مدل،
App\Models\Post
رویدادی را در برنامه سمت سرویس گیرنده شما مانند
PostUpdated
بارگذاری زیر پخش میکند:
{ "model": { "id": 1, "title": "My first post" ... }, ... "socket": "someSocketId",}
حذف مدل
App\Models\User
باعث پخش رویدادی به نام می شود
UserDeleted
.
در صورت تمایل، میتوانید با افزودن یک
broadcastAs
و
broadcastWith
متد به مدل خود، یک نام پخش سفارشی و پیلود تعریف کنید. این روشها نام رویداد/عملیات مدلی را دریافت میکنند که به شما امکان میدهد نام رویداد و بارگذاری را برای هر عملیات مدل سفارشی کنید. اگر
null
از روش برگردانده شود
broadcastAs
، لاراول از قراردادهای نام رویداد پخش مدل که در بالا مورد بحث قرار گرفت هنگام پخش رویداد استفاده می کند:
/** * The model event's broadcast name. */public function broadcastAs(string $event): string|null{ return match ($event) { 'created' => 'post.created', default => null, };} /** * Get the data to broadcast for the model. * * @return array<string, mixed> */public function broadcastWith(string $event): array{ return match ($event) { 'created' => ['title' => $this->title], default => ['model' => $this], };}
گوش دادن به پخش های مدل
هنگامی که این ویژگی را به مدل خود اضافه کردید
BroadcastsEvents
و روش مدل خود را تعریف کردید
broadcastOn
، آماده شنیدن رویدادهای مدل پخش شده در برنامه سمت مشتری خود هستید. قبل از شروع، ممکن است بخواهید با مستندات کامل در مورد
گوش دادن به رویدادها
مشورت کنید .
ابتدا از
private
متد برای بازیابی یک نمونه از یک کانال استفاده کنید، سپس
listen
متد را برای گوش دادن به یک رویداد مشخص فراخوانی کنید. به طور معمول، نام کانالی که به روش داده می شود باید با
قراردادهای پخش مدل
private
لاراول مطابقت داشته باشد
.
پس از به دست آوردن یک نمونه کانال، می توانید از
listen
روش برای گوش دادن به یک رویداد خاص استفاده کنید. از آنجایی که رویدادهای پخش مدل با یک رویداد "واقعی" در
App\Events
فهرست
برنامه شما مرتبط نیست ،
نام رویداد
باید با یک پیشوند باشد
.
تا نشان دهد به فضای نام خاصی تعلق ندارد. هر رویداد پخش مدل دارای یک
model
ویژگی است که شامل تمام خصوصیات قابل پخش مدل است:
Echo.private(`App.Models.User.${this.user.id}`) .listen('.PostUpdated', (e) => { console.log(e.model); });
رویدادهای مشتری
هنگام استفاده از Pusher Channels ، باید گزینه "رویدادهای مشتری" را در بخش "تنظیمات برنامه" داشبورد برنامه خود فعال کنید تا رویدادهای مشتری ارسال شود.
گاهی اوقات ممکن است بخواهید یک رویداد را برای سایر کلاینت های متصل پخش کنید بدون اینکه به برنامه لاراول خود ضربه بزنید. این می تواند به ویژه برای مواردی مانند اعلان های "تایپ کردن" مفید باشد، جایی که می خواهید به کاربران برنامه خود هشدار دهید که کاربر دیگری در حال تایپ پیام در یک صفحه خاص است.
برای پخش رویدادهای مشتری، می توانید از روش Echo استفاده کنید
whisper
:
Echo.private(`chat.${roomId}`) .whisper('typing', { name: this.user.name });
برای گوش دادن به رویدادهای مشتری، می توانید از
listenForWhisper
روش زیر استفاده کنید:
Echo.private(`chat.${roomId}`) .listenForWhisper('typing', (e) => { console.log(e.name); });
اطلاعیه
با جفت کردن پخش رویداد با اعلانها ، برنامه جاوا اسکریپت شما ممکن است اعلانهای جدیدی را بدون نیاز به بازخوانی صفحه دریافت کند. قبل از شروع، حتماً اسناد مربوط به استفاده از کانال اعلان پخش را مطالعه کنید .
هنگامی که یک اعلان را برای استفاده از کانال پخش پیکربندی کردید، می توانید با استفاده از
notification
روش اکو به رویدادهای پخش گوش دهید. به یاد داشته باشید، نام کانال باید با نام کلاس نهاد دریافت کننده اعلان ها مطابقت داشته باشد:
Echo.private(`App.Models.User.${userId}`) .notification((notification) => { console.log(notification.type); });
در این مثال، تمام اعلانهایی که
App\Models\User
از طریق کانال به نمونهها ارسال میشوند
broadcast
، با تماس پاسخ دریافت میشوند. پاسخ تماس مجوز کانال برای
App.Models.User.{id}
کانال در فایل برنامه شما موجود است
routes/channels.php
.