Live Props توی Inertia با Laravel Reverb
خلاصهٔ کاملتر
Paul Redmond توی Laravel News با یه مثال نشون میده live props چطور کار میکنه. این قابلیت از Inertia.js 3.11 اومده و به inertia-laravel 3.7 یا بالاتر نیاز داره. ایده سادهست: یه prop رو live میکنی، یه event رو broadcast میکنی (یعنی از طریق WebSocket به مرورگرهای وصلشده خبر میدی) و هر صفحهای که اون prop رو داره دوباره لودش میکنه. مثال مقاله یه صفحهٔ وضعیت سفارشه که وقتی سفارش ارسال میشه، همه وضعیت جدید رو میبینن.
برای راهاندازی، دستور php artisan install:broadcasting --reverb سرور Reverb رو نصب میکنه، کلیدهای لازم رو به .env اضافه میکنه و برای Vue و React پکیج Echo و فراخوانی configureEcho() رو هم میذاره. توی Svelte باید @laravel/echo-svelte رو دستی نصب کنی. بعد یه event به اسم OrderUpdated میسازی که ShouldBroadcast رو پیاده میکنه و روی یه PrivateChannel مثل orders.{id} پخش میشه. توی routes/channels.php هم یه قانون میذاری که فقط صاحب سفارش بتونه گوش بده.
توی کنترلر، prop رو با Inertia::live() میپیچی و یه نمونه از event رو بهش میدی:
return Inertia::render('Orders/Show', [
'order' => Inertia::live(fn () => $order->fresh(), on: new OrderUpdated($order)),
]);ساختن event اینجا اونو broadcast نمیکنه. Inertia فقط broadcastOn() رو صدا میزنه تا اسم کانال رو پیدا کنه و به صفحه بفرسته. مقدار رو هم باید به شکل closure بدی، چون Inertia هم موقع رندر اول و هم هر بار که prop دوباره لود میشه اجراش میکنه.
سمت فرانت کافیه live: echo() رو به createInertiaApp() بدی و لازم نیست کامپوننت صفحه رو عوض کنی. هر جا سفارش تغییر کرد، OrderUpdated::dispatch($order) رو صدا میزنی تا همهٔ صفحههای باز یه partial reload انجام بدن، یعنی فقط همون prop رو دوباره از سرور بگیرن. با toOthers() هم میشه تب کاربری که خودش تغییر رو داده رد کرد. این متد از هدر X-Socket-Id استفاده میکنه که Inertia خودش میفرسته.
چون eventهای ShouldBroadcast توی queue میرن، علاوه بر php artisan reverb:start باید یه queue worker هم روشن باشه، یا از ShouldBroadcastNow استفاده کنی تا وسط همون درخواست پخش بشه. هوک useProp() هم یه مقدار loading میده تا موقع reload یه پیام «در حال بهروزرسانی» نشون بدی.
وقتی بیننده زیاده، هر event از هر صفحهٔ باز یه درخواست به سرور میفرسته. مقاله پیشنهاد میده مقدار جدید رو با Inertia::broadcastProps() مستقیم توی payload خود event بفرستی تا این درخواستها حذف بشن. ولی چون همه یه payload یکسان میگیرن، برای دادهای که به کاربر بستگی داره مناسب نیست.
Inertia بهطور پیشفرض هر live prop رو حداکثر یه بار در ثانیه reload میکنه و با گزینهٔ throttle (به میلیثانیه) میشه این فاصله رو بیشتر کرد. وقتی تب مخفیه هم reloadها صبر میکنن تا کاربر برگرده.
نکات کلیدی:
- live props از Inertia.js 3.11 و inertia-laravel 3.7 به بعد در دسترسه.
- prop با Inertia::live() و پارامتر on live میشه و event باید ShouldBroadcast رو پیاده کنه.
- سمت کلاینت فقط live: echo() به createInertiaApp() اضافه میشه و کامپوننت صفحه دست نمیخوره.
- toOthers() با هدر X-Socket-Id تب کاربر فعلی رو از reload معاف میکنه.
- پیشفرض یه reload در ثانیهست و با throttle مثلاً روی 5000 میلیثانیه قابل تغییره.
- broadcastProps() درخواستهای اضافه رو حذف میکنه ولی برای دادههای وابسته به کاربر مناسب نیست.




