نسخه:

صدا و سیما

معرفی

در بسیاری از برنامه های کاربردی وب مدرن، 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=443
PUSHER_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=443
PUSHER_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 .