نحوه ساخت اپلیکیشن چت بلادرنگ با Laravel Reverb
در مارس 2024، لاراول 11 منتشر شد . و با آن ابزار جدیدی در اکوسیستم لاراول وارد شد: Laravel Reverb .
Reverb یک بسته منبع باز جداگانه است که یک سرور WebSocket شخص اول برای برنامه های لاراول است. این به تسهیل ارتباط بلادرنگ بین مشتری و سرور کمک می کند.
قبل از این بسته جدید، لاراول پخش رویداد داشت، اما اساساً راهی برای راه اندازی یک سرور WebSocket خود میزبان نداشت. خوشبختانه، Reverb اکنون این گزینه را به ما می دهد.
Laravel Reverb چند ویژگی کلیدی دارد: به زبان PHP نوشته شده است، سریع است و مقیاس پذیر است. این به ویژه توسعه یافته است تا به صورت افقی مقیاس پذیر باشد.
Reverb اساساً به شما امکان می دهد یک برنامه را روی یک سرور واحد اجرا کنید - اما اگر برنامه شروع به رشد بیشتر از آن سرور کند، می توانید چندین سرور اضافی اضافه کنید. سپس آن سرورها می توانند با یکدیگر ارتباط برقرار کنند تا پیام ها را بین خود توزیع کنند.
در این مقاله یاد خواهید گرفت که چگونه با استفاده از Laravel Reverb یک برنامه چت بلادرنگ بسازید. این به شما امکان می دهد به راحتی ارتباطات WebSocket را بین باطن و فرانت اند خود پیاده سازی کنید.
برای یک فناوری frontend، می توانید از هر چیزی که می خواهید استفاده کنید - اما در این مورد ما از React.js با ابزار ساخت Vite.js استفاده خواهیم کرد.
در پایان این مقاله، یک برنامه تمام پشته و بلادرنگ در دستگاه محلی خود خواهید داشت که به این صورت عمل می کند:
فهرست مطالب
نحوه راه اندازی یک رویداد لاراول
نحوه راه اندازی یک کار صف لاراول
نحوه راه اندازی کانال های WebSocket
نحوه سفارشی سازی نماهای لاراول
پیش نیازها
برای برنامه ای که در این مقاله می سازیم به ابزارهای زیر نیاز دارید:
PHP : نسخه 8.2 یا بالاتر (برای تحلیل نسخه php -v
اجرا کنید)
آهنگساز ( composer
اجرا کنید تا تحلیل کنید که وجود دارد)
Node.js : نسخه 20 یا بالاتر (برای تحلیل نسخه، node -v
اجرا کنید)
MySQL : نسخه 5.7 یا بالاتر ( mysql --version
برای تحلیل وجود آن اجرا کنید یا برای نصب آن اسناد را دنبال کنید)
مراحل کلی
مراحل اصلی در این مقاله به شرح زیر خواهد بود:
نصب لاراول 11.
گفت ن جریان احراز هویت به آن (داربست احراز هویت). لاراول با استفاده از Bootstrap با React/Vue یک نقطه شروع اولیه برای این کار فراهم می کند.
در حال نصب Reverb
کامپوننتهای React.js و شنیدن رویداد در فرانتاند.
نحوه نصب لاراول
برای شروع، Laravel 11 را با استفاده از دستور composer نصب کنید:
composer create-project laravel/laravel:^11.0 laravel-reverb-react-chat && cd laravel-reverb-react-chat/
در این مرحله، می توانید با اجرای دستور serve
برنامه را تحلیل کنید:
php artisan serve
نحوه ایجاد مدل و مهاجرت
با استفاده از این دستور می توانید یک مدل و یک مهاجرت برای پیام ها ایجاد کنید:
php artisan make:model -m Message
سپس باید مدل پیام را با کد زیر تنظیم کنید:
همانطور که می بینید، یک دسترسی getTimeAttribute()
وجود دارد که مهر زمانی ایجاد پیام را به فرمت تاریخ و زمان قابل خواندن توسط انسان قالب بندی می کند. آن را در بالای هر پیام در کادر چت نشان می دهد.
سپس، مهاجرت را برای جدول پایگاه داده messages
با این کد تنظیم کنید:
این انتقال یک جدول messages
را در پایگاه داده ایجاد می کند. این جدول شامل ستونهایی برای یک کلید اصلی افزایشدهنده خودکار ( id
)، یک کلید خارجی ( user_id
) است که به ستون id
جدول users
ارجاع میدهد، یک ستون text
برای ذخیره محتوای پیام، و timestamps
برای ردیابی خودکار زمانهای ایجاد و اصلاح هر رکورد
مهاجرت همچنین شامل یک روش بازگشتی ( down()
) برای رها کردن جدول messages
در صورت نیاز است.
در این مقاله از پایگاه داده MySQL استفاده می کنیم، اما در صورت تمایل می توانید SQLite را به عنوان پیش فرض استفاده کنید. فقط مطمئن شوید که اعتبار پایگاه داده خود را در فایل .env
به درستی تنظیم کرده اید:
پس از تنظیم متغیرهای محیط، کش را بهینه کنید:
php artisan optimize
برای ایجاد مجدد جداول پایگاه داده و همچنین اضافه کردن جدول messages
، migrations را اجرا کنید:
php artisan migrate:fresh
نحوه گفت ن احراز هویت
اکنون، می توانید داربست احراز هویت را به برنامه خود اضافه کنید. می توانید از بسته UI لاراول برای وارد کردن برخی از فایل های دارایی استفاده کنید. ابتدا باید بسته مناسب را نصب کنید:
composer require laravel/ui
سپس دارایی های مربوط به React را به برنامه وارد کنید:
php artisan ui react --auth
ممکن است درخواست بازنویسی app/Http/Controllers/Controller.php
باشد، و شما می توانید ادامه دهید و اجازه دهید:
The [Controller.php] file already exists. Do you want to replace it? (yes/no) [no]
این کار تمام داربستهای احراز هویت کامپایلشده و نصبشده را انجام میدهد، از جمله مسیرها، کنترلکنندهها، نماها، پیکربندیهای vite و یک نمونه ساده مخصوص React.
در این مرحله، شما فقط یک قدم با آماده شدن برنامه فاصله دارید.
توجه: مطمئن شوید که Node.js (با npm ) نسخه 20 یا بالاتر را نصب کرده اید. با اجرای دستور node -v
می توانید آن را تحلیل کنید. در غیر این صورت، فقط پیش بروید و آن را با استفاده از صفحه رسمی نصب کنید.
npm install && npm run build
دستور بالا بسته های NPM را نصب می کند و دارایی های frontend می سازد. اکنون می توانید برنامه لاراول را راه اندازی کنید و نمونه برنامه کاملاً آماده خود را تحلیل کنید:
php artisan optimize && php artisan serve
همچنین مهم است که توجه داشته باشید که می توانید به جای استفاده از build
هر بار که در حال ایجاد تغییرات در فایل های frontend هستید، به طور جداگانه دستور dev
را اجرا کنید:
npm run dev
جزئیات را در فایل package.json
در قسمت scripts
مشاهده کنید.
نحوه تنظیم مسیرها
در این برنامه چت بلادرنگ، باید چند مسیر داشته باشید:
home
برای صفحه اصلی (از قبل باید اضافه شود)
message
برای گفت ن پیام جدید
messages
برای دریافت تمام پیام های موجود
این نوع مسیرها را در فایل web.php
خواهید داشت:
<?php use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Route; use App\Http\Controllers\HomeController; Route::get('/', function () { return view('welcome'); }); Auth::routes(); Route::get('/home', [HomeController::class, 'index']) ->name('home'); Route::get('/messages', [HomeController::class, 'messages']) ->name('messages'); Route::post('/message', [HomeController::class, 'message']) ->name('message');
پس از تنظیم آن مسیرها، بیایید از مزایای Laravel Events و Queue Jobs استفاده کنیم.
نحوه راه اندازی یک رویداد لاراول
برای گوش دادن به یک رویداد خاص باید یک رویداد GotMessage
ایجاد کنید:
php artisan make:event GotMessage
رویدادهای لاراول یک پیادهسازی الگوی مشاهدهگر ساده را ارائه میکنند، که به شما امکان میدهد مشترک شوید و به رویدادهای مختلفی که در برنامه شما رخ میدهد گوش دهید. کلاسهای رویداد معمولاً در فهرست app/Events
ذخیره میشوند. ( اسناد )
یک کانال WebSocket خصوصی به روش broadcastOn
برای همه کاربران احراز هویت شده برای دریافت پیام ها در زمان واقعی راه اندازی کنید. در این مورد، آن را "channel_for_everyone"
می نامیم، اما می توانید بسته به کاربر آن را پویا کنید، مانند "App.Models.User.{$this->message['user_id']}"
.
همانطور که می بینید، یک ویژگی عمومی $massage
به عنوان آرگومان سازنده وجود دارد، پس می توانید اطلاعات پیام را در قسمت جلویی دریافت کنید.
ما قبلاً از نام کانال در فایل کانالها استفاده کردهایم، و از آن در قسمت جلویی نیز برای بهروزرسانی پیامهای بلادرنگ استفاده میکنیم.
فراموش نکنید که رابط ShouldBroadcast
را در کلاس رویداد پیاده سازی کنید.
نحوه راه اندازی یک کار صف لاراول
اکنون زمان ایجاد کار SendMessage
برای ارسال پیام است:
php artisan make:job SendMessage
لاراول به شما این امکان را می دهد که به راحتی مشاغل در صف ایجاد کنید که ممکن است در پس زمینه پردازش شوند. با انتقال وظایف زمان بر به صف، برنامه شما می تواند به درخواست های وب با سرعتی خیره کننده پاسخ دهد و تجربه کاربری بهتری را به مشتریان خود ارائه دهد. ( اسناد )
کار صف SendMessage.php
مسئول ارسال رویداد GotMessage
با اطلاعات مربوط به یک پیام تازه ارسال شده است. پس از ساخت، یک شیء Message
دریافت می کند که نشان دهنده پیامی است که باید ارسال شود.
در متد handle()
خود، رویداد GotMessage
را با جزئیاتی مانند شناسه پیام، شناسه کاربر، متن و مهر زمانی ارسال میکند. این کار به گونه ای طراحی شده است که برای پردازش ناهمزمان در صف قرار می گیرد و امکان مدیریت کارآمد وظایف ارسال پیام در پس زمینه را فراهم می کند.
همانطور که می بینید، یک ویژگی عمومی $massage
به عنوان آرگومان سازنده وجود دارد که از آن برای پیوست کردن اطلاعات پیام به کار صف استفاده می کنیم.
نحوه نوشتن متدهای کنترلر
برای مسیرهای تعریف شده، در اینجا روش های کنترل کننده مناسب وجود دارد:
در روش home
، داده های وارد شده کاربر را با استفاده از مدل User
از پایگاه داده دریافت کرده و به نمای تیغه ارسال می کنیم.
در روش messages
، همه پیامها را از پایگاه داده با استفاده از مدل Message
بازیابی میکنیم، دادههای ارتباط user
را به آن پیوست میکنیم، فیلد time
(دسترس) را به هر آیتم اضافه میکنیم و همه آنها را به view ارسال میکنیم.
در روش message
، با استفاده از مدل Message
یک پیام جدید در جدول پایگاه داده ایجاد می شود و کار صف SendMessage
ارسال می شود.
نحوه نصب Laravel Reverb
اکنون به مهم ترین لحظه رسیده ایم: زمان نصب Reverb در برنامه لاراول است.
آن چنان آسان. تمام تنظیمات بسته بندی و پیکربندی لازم را می توان با استفاده از این دستور انجام داد:
php artisan install:broadcasting
از شما می خواهد که Laravel Reverb را نصب کنید و همچنین وابستگی های Node مورد نیاز برای پخش را نصب و بسازید. برای ادامه کافیست اینتر را فشار دهید.
پس از اجرای دستور، مطمئن شوید که به طور خودکار متغیرهای محیطی خاص reverb را به فایل .env
اضافه کرده اید، مانند:
BROADCAST_CONNECTION=reverb ### REVERB_APP_ID=795051 REVERB_APP_KEY=s3w3thzezulgp5g0e5bs REVERB_APP_SECRET=gncsnk3rzpvczdakl6pz REVERB_HOST="localhost" REVERB_PORT=8080 REVERB_SCHEME=http VITE_REVERB_APP_KEY="${REVERB_APP_KEY}" VITE_REVERB_HOST="${REVERB_HOST}" VITE_REVERB_PORT="${REVERB_PORT}" VITE_REVERB_SCHEME="${REVERB_SCHEME}"
همچنین دو فایل پیکربندی جدید در دایرکتوری config
خواهید داشت:
reverb.php
broadcasting.php
نحوه راه اندازی کانال های WebSocket
در نهایت، باید یک کانال در فایل channels.php
اضافه کنید. پس از نصب Reverb باید از قبل ایجاد شود.
شما فقط یک کانال خواهید داشت. می توانید نام کانال را تغییر دهید و آن را پویا کنید - این به شما بستگی دارد. در بسته شدن کانال، ما همیشه true را برمیگردانیم، اما میتوانید بعداً آن را تغییر دهید تا محدودیتهایی در مورد اشتراک کانال ایجاد کنید.
یک بار دیگر کش ها را بهینه کنید:
php artisan optimize
نحوه سفارشی سازی نماهای لاراول
اکنون قسمت پشتی شما باید در این مرحله آماده باشد، پس می توانید به قسمت جلویی بروید.
قبل از کار بر روی موارد React، باید نماهای Laravel *.blade.php
را تنظیم کنید. در نمای home
blade، حتماً root div را با شناسه main
داشته باشید تا همه اجزای React را در آنجا رندر کنید.
div با شناسه main
یک ویژگی داده برای نگهداری $user
info ارسال شده از روش home
controller دریافت می کند.
من کل محتوای resources/views/welcome.blade.php
را اینجا قرار نمی دهم، اما شما فقط می توانید تغییرات کوچک زیر را در آن ایجاد کنید:
url('/dashboard')
با url('/home')
جایگزین کنید.
جایگزینی Dashboard
با Home
بخش های main
و footer
را حذف کنید.
بیایید روی جبهه کار کنیم
در Reverb، پخش رویداد توسط یک درایور پخش سمت سرور انجام می شود که رویدادهای Laravel شما را پخش می کند تا قسمت جلویی بتواند آنها را در مشتری مرورگر دریافت کند.
در قسمت جلو، Laravel Echo این کار را در زیر کاپوت انجام می دهد. پژواک کتابخانه جاوا اسکریپت که اشتراک در کانال ها و گوش دادن به رویدادهای پخش شده توسط درایور پخش سمت سرور را بدون دردسر می کند.
میتوانید تنظیمات پیکربندی WebSocket را با Echo در فایل rources/js/echo.js
بیابید، اما برای این پروژه نیازی به انجام کاری در آنجا ندارید.
بیایید چند کامپوننت React ایجاد کنیم تا یک پروژه بازسازی شده و خواناتر داشته باشیم.
یک کامپوننت Main.jsx
در پوشه components
جدید ایجاد کنید:
در اینجا تحلیل میکنیم که آیا عنصری با شناسه 'main'
وجود دارد یا خیر. اگر وجود داشته باشد، با رندر کردن برنامه React ادامه میدهد.
همانطور که می بینید، یک جزء ChatBox
وجود دارد. به زودی در مورد آن بیشتر خواهیم آموخت.
فایل resources/js/components/Example.jsx
را حذف کرده و جزء Main.jsx
را در app.js
وارد کنید:
import './bootstrap'; import './components/Main.jsx';
فایلهای Message.jsx
و MessageInput.jsx
را ایجاد کنید تا بتوانید از آنها در بخش ChatBox
استفاده کنید.
مؤلفه Message
آرگومان های userId
و message
(فیلدها) را برای نمایش هر پیام در کادر چت دریافت می کند.
مؤلفه Message.jsx
پیامهای فردی را در رابط چت ارائه میکند. userId
و message
را دریافت میکند. بر اساس اینکه آیا فرستنده پیام با کاربر فعلی مطابقت دارد یا خیر، پیام را در سمت مناسب صفحه تراز می کند.
هر پیام شامل نام فرستنده، مهر زمانی و خود محتوای پیام است که بر اساس اینکه پیام توسط کاربر فعلی ارسال شده باشد یا کاربر دیگری، سبک متفاوتی دارد.
مؤلفه MessageInput
به ایجاد یک پیام جدید اهمیت می دهد:
جزء MessageInput
یک فیلد ورودی فرم را برای کاربران فراهم می کند تا پیام ها را تایپ کرده و آنها را در رابط چت ارسال کنند. با کلیک کردن روی دکمه، تابعی را راه اندازی می کند تا پیام را از طریق یک درخواست Axios POST به rootUrl
مشخصی که از مؤلفه ChatBox
والد دریافت کرده است، به سرور ارسال کند. همچنین اعتبارسنجی را انجام می دهد تا اطمینان حاصل شود که کاربران نمی توانند پیام های خالی ارسال کنند. در صورت تمایل می توانید بعداً آن را سفارشی کنید.
اکنون یک کامپوننت ChatBox.jsx
ایجاد کنید تا قسمت جلویی آماده باشد:
جزء ChatBox
یک رابط چت را در برنامه مدیریت می کند. با استفاده از درخواست های WebSocket و HTTP، پیام ها را از یک سرور واکشی و نمایش می دهد.
این مؤلفه فهرستی از پیامها، یک فیلد ورودی پیام را ارائه میکند و با رسیدن پیامهای جدید بهطور خودکار به پایین صفحه میرود.
این یک کانال WebSocket را برای به روز رسانی پیام در زمان واقعی تعریف می کند. شما باید آن کانال را با استفاده از همان نامی که در routes/hannels.php
و در صف app/Events/GotMessage.php
نوشته شده است، راه اندازی کنید.
همچنین، تابع leave()
در تابع پاکسازی useEffect
فراخوانی می شود تا زمانی که کامپوننت خارج می شود، اشتراک از کانال WebSocket لغو شود. این کار از نشت حافظه و اتصالات غیرضروری به شبکه با متوقف کردن قطعه از گوش دادن به بهروزرسانیها در کانال WebSocket پس از عدم نیاز به آن جلوگیری میکند.
اجرای برنامه
اکنون، همه چیز آماده است و زمان آن است که برنامه را تحلیل کنید. این دستورالعمل ها را دنبال کنید:
داراییهای frontend بسازید (این یک فرمان در حال اجرا "برای همیشه" نیست):
npm run build
شروع به گوش دادن به رویدادهای لاراول کنید:
php artisan queue:listen
سرور WebSocket را راه اندازی کنید:
php artisan reverb:start
سرور را راه اندازی کنید (شما می توانید از یک جایگزین برای برنامه خود مانند یک سرور محلی در حال اجرا استفاده کنید):
php artisan serve
پس از اجرای تمام دستورات لازم، میتوانید با مراجعه به URL پیشفرض برنامه را تحلیل کنید: http://127.0.0.1:8000
.
برای آزمایش، می توانید دو کاربر مختلف را ثبت نام کنید، از آن کاربران بخواهید وارد شوند، از هر یک از آنها پیام بفرستند و کادر چت را مشاهده کنند.
منابع مفید Reverb
اکنون که به پایان این مقاله رسیدهایم، ارزش فهرست کردن منابع مفید در مورد Reverb را دارد:
پخش لاراول (اسناد رسمی)
Taylor Otwel - Laravel Update (گفتگو در مورد Laracon EU 2024)
جو دیکسون در X (خالق Reverb)
قسمت Laracast (مثال عملی با Reverb)
نتیجه
اکنون می دانید که چگونه در نسخه جدید لاراول، برنامه های بلادرنگ با Laravel Reverb بسازید. با این کار، میتوانید ارتباطات WebSocket را در برنامه کامل خود پیادهسازی کنید و از استفاده از سرویسهای شخص ثالث اضافی (مانند Pusher و Socket.io) خودداری کنید.
اگر می خواهید ایده روشنی در مورد نحوه ادغام React.js در برنامه لاراول خود بدون استفاده از ابزارهای اضافی لاراول (مانند Inertia) داشته باشید، می توانید مقاله قبلی freeCodeCamp من را مطالعه کنید، جایی که می توانید یک صفحه تک صفحه ای و کامل بسازید. پشته برنامه Tasklist.
کد کامل این مقاله در اینجا در GitHub من است ⭐ ، جایی که من به طور فعال بسیاری از کارهایم را در مورد فن آوری های مختلف مدرن منتشر می کنم.
برای اطلاعات بیشتر می توانید به وب سایت من مراجعه کنید: boolfalse.com
ارسال نظر