ساخت یک برنامه چت بلادرنگ با استفاده از Laravel Reverb و Vue

Summarize this content to 400 words in Persian Lang
نوشته شده توسط روزاریو دی کیارا✏️
Laravel Reverb یک چارچوب وب سوکت بلادرنگ است که رویدادها را از لاراول به فرانتاند پخش میکند. این امکان همگام سازی بلادرنگ داده ها را در بین مشتریان متصل بدون بارگیری مجدد صفحه فراهم می کند. Vue یک چارچوب جاوا اسکریپت است که اجازه می دهد تا یک تجربه ظاهری واکنشی و مبتنی بر مؤلفه داشته باشید.
در این راهنما، ساختن یک برنامه چت کاملاً کاربردی و بلادرنگ را با استفاده از باطن Laravel Reverb و Frontend واکنشی Vue بررسی خواهیم کرد. طبق معمول، کد نهایی و عملکردی در این مخزن GitHub موجود است.
راه اندازی پیش نیازهای Laravel و Vue
قبل از شروع توسعه، باید محیطی متشکل از دو مؤلفه راه اندازی کنید: لاراول که مبتنی بر PHP است و مؤلفه Vue/Node.
PHP: نسخه 8.2 یا بالاتر (اجرا شود php -v برای بررسی نسخه)
آهنگساز (اجرا composer برای بررسی وجود آن)
Node.js: نسخه 20 یا بالاتر (اجرا شود node -v برای بررسی نسخه)
در تصویر زیر می توانید خروجی دستور بالا را در دستگاه ویندوز من مشاهده کنید:
برای پایگاه داده، ما از SQLite استفاده خواهیم کرد، پس حتما آن را در خود فعال کنید php.ini فایل هنگامی که تمام پیش نیازهای اساسی را برآورده کردید، می توانید با استفاده از موارد زیر یک پروژه لاراول ایجاد کنید:
> composer create-project laravel/laravel:^11.0 laravel_chat_demo
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
پس از آماده سازی ریشه پروژه خود برای شروع توسعه، ممکن است نیاز به نصب برخی الزامات بیشتری داشته باشید. این فرآیند به محیط خاص شما بستگی دارد، اما، به طور کلی، سعی کنید خود را بسازید composer دستور happy (🙂)، اگر شکایت کرد (یا فقط به شما هشدار داد) که بسته ای از دست رفته است، آن بسته را نصب کنید (Google دوست شماست).
وقتی همه چیز درست شد، باید بتوانید موارد زیر را اجرا کنید:
> php artisan serve
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
این محیط توسعه شما را روشن می کند.
ساخت مدل داده برای پیام های چت
اکنون که محیط توسعه (امیدوارم) خوب است، میتوانیم روی بخش محرک توسعه تمرکز کنیم.
ما در حال نوشتن یک برنامه وب چت هستیم تا بتوانیم انتظار مدیریت پیام ها را داشته باشیم. با دستور زیر یک کلاس کاملاً جدید در قسمت دریافت می کنیم /app/Models که نشان دهنده پیام های رد و بدل شده در چت ما خواهد بود:
> php artisan make:model -m Message
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
در حال حاضر کلاس خالی است. ما آن را با داده ها و عملکردها تخصصی خواهیم کرد، بنابراین فایل را جایگزین کنید Message.php با کد زیر:
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class Message extends Model
{
use HasFactory;
public $table = ‘messages’;
protected $fillable = [‘id’, ‘user_id’, ‘text’];
public function user(): BelongsTo
{
return $this->belongsTo(User::class, ‘user_id’);
}
public function getTimeAttribute(): string
{
return date(
“d M Y, H:i:s”,
strtotime($this->attributes[‘created_at’])
);
}
}
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
کد بالا پیامی را در سیستم ما توصیف می کند: پیام ها در جدولی که نامش ذکر شده ذخیره می شود messages; هر پیام شامل سه قسمت است: id، user_id، و text. بقیه کد دو کار را انجام می دهد: تابعی ایجاد می کند که کد را برمی گرداند user مرتبط با پیام با استفاده از BelongsTo صفت، و تابعی را تعریف می کند که فیلد را قالب بندی می کند created_at در قالب تاریخ و زمان قابل خواندن برای انسان. در بالای هر پیام در کادر چت استفاده خواهد شد.
مدلی که ما نوشتیم به Eloquent (ORM لاراول) نحوه تعامل با داده های پایگاه داده خود را آموزش می دهد، مرحله بعدی ایجاد جدول در پایگاه داده است. برای انجام این کار ما به یک مهاجرت نیاز داریم، یعنی قطعه ای از کد که جدول را ایجاد می کند:
> php artisan make:migration create_message_table
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
با این کار یک فایل مهاجرت خالی ایجاد می شود database\migrations\ که نامش چیزی شبیه به _create_message_table.php. فایل شامل دو روش کلیدی است: up و down. این up متد تغییراتی را در طرح پایگاه داده شما ایجاد می کند، مانند ایجاد جداول جدید، اضافه کردن ستون ها یا ایجاد نمایه ها.
برعکس، down نقش متد خنثی کردن یا معکوس کردن تغییرات ایجاد شده توسط مربوطه است up روش، به طور موثر به شما امکان می دهد در صورت نیاز تغییرات را به عقب برگردانید. ما این فایل را با کد زیر تخصصی می کنیم:
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up(): void {
Schema::create(‘messages’, function (Blueprint $table) {
$table->id();
$table->timestamps();
$table->foreignId(‘user_id’)->constrained();
$table->text(‘text’)->nullable();
});
}
public function down(): void {
Schema::dropIfExists(‘messages’);
}
};
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
این انتقال یک جدول پیام های جدید را با چند فیلد تعریف می کند: شناسه افزایش خودکار به عنوان کلید اصلی، user_id که به جدول کاربران برای پیوند دادن پیام ها با فرستنده آنها و یک فیلد متنی برای ذخیره محتوای پیام ارجاع می دهد.
این جدول همچنین دارای ستونهای مهر زمانی است تا زمان ایجاد و تغییر خودکار هر پیام را ردیابی کند. مهرهای زمانی این دو فیلد را ایجاد خواهند کرد created_at و updated_at. به عنوان یک اقدام احتیاطی، این عملیات شامل یک روش معکوس است که میتواند در صورت نیاز جدول پیامها را حذف کند و امکان بازگشت آسان این تغییرات را فراهم کند.
در این مرحله، بیایید موارد زیر را اجرا کنیم:
> php artisan migrate:fresh
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
با این کار یک جدول جدید در پایگاه داده ایجاد می شود. اگر می خواهید بررسی کنید که موفقیت آمیز بوده است، به سادگی آن را باز کنید database\database.sqlite فایل
افزودن ثبت نام و ورود کاربر
اکنون که فضایی برای دادهها داریم، نوبت به ایجاد فرانتاند رسیده است. هنگام توسعه رابط کاربری برای یک برنامه لاراول، شما دو گزینه اصلی دارید: اولی شامل استفاده از PHP برای ساخت ظاهر خود است. در مقابل، دومی از چارچوب های جاوا اسکریپت مانند Vue یا React استفاده می کند.
ما در این مقاله از Vue استفاده خواهیم کرد. این همچنین به توسعه دهندگان امکان می دهد از اکوسیستم بسته های عظیم و ابزارهای موجود از طریق npm استفاده کنند. ابتدا باید بسته مناسب را نصب کنیم:
> composer require laravel/ui
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
یک بار laravel/ui بسته نصب شده است، می توانید داربست جلویی را با استفاده از آن نصب کنید artisan دستور: دستور زیر رابط کاربری را برای مدیریت ثبت نام و ورود به برنامه وب ما ایجاد می کند. فقط در نظر بگیرید که این کار چقدر می تواند پیچیده باشد اگر باید این را از ابتدا بنویسید و چقدر آسان است که در لاراول انجام می شود:
> php artisan ui vue –auth
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
در این مرحله، ما دو نیمه پروژه را داریم: PHP در حال حاضر با دستور PHP artisan serve در حال اجرا است. اکنون زمان اجرای بخش مبتنی بر جاوا اسکریپت است:
> npm install
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
برای اینکه هر دو قسمت در حال اجرا باشند، دو پنجره پوسته را باز کنید. یکی در حال اجرا artisan دستور و دیگری با دستور زیر:
> npm run dev
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
این دستور جلوی صفحه را در حال اجرا نگه میدارد و هر بار که آن را تغییر میدهیم دوباره آن را بارگیری میکند.
در پایان این فرآیند، بدون نوشتن یک خط کد، یک وب سایت کاملاً کاربردی با امکان مدیریت احراز هویت کاربر داریم. برای ثبت نام کاربر جدید به http://127.0.0.1:8000/register بروید و وارد وبسایت شوید:
پیکربندی مسیرها برای API پیام چت
اکنون، باید مسیرهایی را برای API های مختلفی که قرار است میزبانی کنیم اضافه کنیم:
/home برای صفحه اصلی – این باید از قبل وجود داشته باشد
/message، یک روش POST HTTP برای افزودن یک پیام جدید
/messages برای دریافت تمام پیام های موجود
را اصلاح خواهیم کرد /routes/web.php به شرح زیر
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\HomeController;
Route::get(“https://dev.to/”, 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’);
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
اکنون زمان نوشتن است HomeController که API هایی را که در بالا توضیح دادیم پیاده سازی می کند:
namespace App\Http\Controllers;
use App\Jobs\SendMessage;
use App\Models\Message;
use App\Models\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class HomeController extends Controller
{
public function __construct()
{
$this->middleware(‘auth’);
}
public function index()
{
$user = User::where(‘id’, auth()->id())->select([
‘id’,
‘name’,
’email’,
])->first();
return view(‘home’, [
‘user’ => $user,
]);
}
public function messages(): JsonResponse
{
$messages = Message::with(‘user’)->get()->append(‘time’);
return response()->json($messages);
}
public function message(Request $request): JsonResponse
{
$message = Message::create([
‘user_id’ => auth()->id(),
‘text’ => $request->get(‘text’),
]);
SendMessage::dispatch($message);
return response()->json([
‘success’ => true,
‘message’ => “Message created and job dispatched.”,
]);
}
}
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
در اینجا می توانید منطق پشت APIهایی که در بالا توضیح داده شد را مشاهده کنید:
در /home روش، ما اطلاعات کاربر وارد شده را از پایگاه داده با استفاده از بازیابی می کنیم User مدل کنید و آن را به نمایش منتقل کنید
در /messages روش، ما همه پیام ها را از پایگاه داده از طریق واکشی می کنیم Message مدل، شامل داده های کاربر مرتبط، اضافه کردن time فیلد (با استفاده از یک Accessor) برای هر کدام messageو مجموعه کامل را به view ارسال کنید
در /message روش، ما یک روش جدید ایجاد خواهیم کرد message در پایگاه داده با استفاده از Message مدل و ارسال کنید SendMessage کار صف
وقتی همه چیز تنظیم شد، میتوانیم رویدادهای لاراول و کارهای صف را برای میزبانی تبادل و همگامسازی پیامها نصب و پیکربندی کنیم.
پیکربندی رویداد لاراول و کار صف
سیستمهای شغلی رویداد و صف لاراول ابزارهای قدرتمندی را برای انجام وظایف ناهمزمان و جداسازی بخشهای مختلف یک برنامه ارائه میکنند.
رویدادها به شما این امکان را می دهند که اعمال یا تغییرات خاصی را در برنامه خود تعریف و پخش کنید، که شنوندگان می توانند سپس به آنها پاسخ دهند. مشاغل صف به شما امکان میدهند کارهای زمانبر، مانند ارسال ایمیل یا پردازش مجموعههای داده بزرگ، را برای کارمندان پسزمینه بارگذاری کنید، و اطمینان حاصل کنید که برنامه شما پاسخگو و کارآمد باقی میماند.
این ویژگیها با هم، مقیاسپذیری را افزایش میدهند و تجربه کلی کاربر را با مدیریت فرآیندها در پسزمینه بهبود میبخشند. ما از هر دو استفاده خواهیم کرد: event اساسا یک محفظه داده است که پیام را نگه می دارد و QueueListener تعداد پیام هایی که منتظر ارسال هستند را کنترل می کند.
با دستور زیر، ما را تولید می کنیم Event کلاس در /app/Events دایرکتوری:
> php artisan make:event GotMessage
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
سپس ما باید دو چیز را پیاده سازی کنیم: سازنده ای که توصیف می کند بار این رویداد چیست و broadcastOn() روشی برای تعیین اینکه این رویدادها در کدام کانال پخش شوند:
namespace App\Events;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class GotMessage implements ShouldBroadcast {
use Dispatchable, InteractsWithSockets, SerializesModels;
public function __construct() {
}
public function broadcastOn() {
return new PrivateChannel(“channel_for_everyone”);
}
}
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
نام کانال (“channel_for_everyone”) در فایلی که WebSocket را توصیف می کند (به زیر مراجعه کنید) استفاده می شود که کانال ارتباطی بین هر نمونه از کلاینت چت و سرور را نشان می دهد. در اینجا توجه داشته باشید که سازنده هیچ پارامتری را نمی گیرد و هیچ اشاره ای به پیام ها ندارد: ایده این است که این رویداد زمانی پخش می شود که یک پیام جدید ارسال شود، هنگامی که مشتری آن را دریافت کرد، آنها فقط لیست به روز شده پیام ها را با استفاده از خدماتی که قبلا پیاده سازی کرده بودیم به سرور درخواست می کنند.
برای تولید QueueListener، از موارد زیر استفاده می کنیم:
> php artisan make:job SendMessage
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
این دستور تولید می کند SendMessage.php فایل در /app/Jobs دایرکتوری این فایل به چارچوب لاراول آموزش می دهد که چگونه نمونه های جدید ایجاد شده را مدیریت کند GotMessage رویدادی که قبلا تعریف کردیم:
namespace App\Jobs;
use App\Events\GotMessage;
use App\Models\Message;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class SendMessage implements ShouldQueue {
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public function __construct(public Message $message) {
//
}
public function handle(): void {
GotMessage::dispatch([
‘id’ => $this->message->id,
‘user_id’ => $this->message->user_id,
‘text’ => $this->message->text,
‘time’ => $this->message->time,
]);
}
}
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
این handle() روش ارسال می کند GotMessage رویداد با جزئیاتی مانند پیام id، user_id، text، و timestamp. این کار به گونهای طراحی شده است که در پسزمینه، رویدادها را تا زمانی که در کانال قرار میگیرند بهصورت ناهمزمان پردازش کند، و امکان مدیریت کارآمد وظایف ارسال پیام در پسزمینه را فراهم میکند. همانطور که می بینید، عمومی وجود دارد $message ویژگی به عنوان آرگومان سازنده؛ این به اجرای کارآمدتر فرآیند صف کمک می کند (برای جزئیات بیشتر به مستندات مراجعه کنید).
با وجود تمام اجزای دیگر، اکنون فقط باید عنصر PHP نهایی را برای پروژه اضافه کنیم: WebSocket.
اضافه کردن Laravel Reverb
Laravel Reverb یک فریم ورک بلادرنگ WebSocket را ارائه میکند که به شما امکان میدهد رویدادها را از برنامه لاراول خود با استفاده از WebSockets به فرانتاند ارسال کنید. با Reverb، امکان پخش رویدادهایی که در بالا تعریف کردیم، در هر کلاینت متصل منعکس شده است، بدون نیاز به بارگذاری مجدد صفحه. طبق معمول، افزودن این ویژگی بسیار پیچیده با یک دستور ساده انجام می شود:
> php artisan install:broadcasting
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
با پذیرفتن گزینه پیش فرض، هم قسمت PHP برای backend و هم وابستگی Node را برای استفاده در frontend نصب می کند.
اجرای این دستور چندین تغییر در دایرکتوری پروژه شما ایجاد می کند: یک بخش جدید به آن اضافه می کند .env فایل برای Reverb، ایجاد یک reverb.php فایل در /config برای خواندن این فیلدهای جدید، و مهمتر از همه، اضافه کردن یک channels.php فایل در /routes. در این channels.php Reverb را برای ایجاد آن پیکربندی می کنیم channel_for_everyone کانال را با اضافه کردن کد زیر:
Broadcast::channel(‘channel_for_everyone’, function ($user) {
return true;
});
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
در این مرحله، همه چیز در قسمت پشتیبان سر جای خود است. اکنون میتوانیم روی قسمت جلویی تمرکز کنیم.
ساخت جلویی Vue
در این بخش، یک ظاهر ساده با تمرکز بر عملکرد و یکپارچگی، بدون استایل، سفارشی سازی فونت و غیره طراحی می کنیم.
اولین قدم تنظیم محیط Vue است:
> npm install vue vue-router @vitejs/plugin-vue“`
{% endraw %}
Now we can focus on three files to integrate a Vue template in Laravel. The first one is {% raw %}`resources/js/app.js`{% endraw %}, which will instantiate the Vue component that contains our app:
{% raw %}
“`javascript
import ‘./bootstrap’;
import App from ‘./App.vue’
import { createApp } from ‘vue’;
const app = createApp({});
app.component(‘app’, App);
app.mount(“#app”);
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
کد ساده است: App.vue الگوی Vue ما است و ما فقط آن را با div که id است #app در blade فایل (به قطعه کد بعدی مراجعه کنید) که برنامه وب ما را رندر می کند. فایل بعدی است resources/js/App.vue، که شامل قالب است:
<script setup>
const props = defineProps({
isAuth: {
type: Boolean,
default: false
},
user: {
type: [Object, Array],
required: false
}
})
</script>
<template>
<h1>Hello, {{ user.name }}</h1>
</template>
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
کد دو کار را انجام می دهد: آن را تعریف می کند props برای Vue برای میزبانی مقادیری که از لاراول می آیند، و سپس یک پیام ساده نمایش می دهد. همانطور که می بینید، ما به تازگی احراز هویت فعلی را دریافت کردیم user و آنها را نشان دهند name.
آخرین فایل این است blade که مؤلفه Vue و دادههایی را که میخواهیم به آن تغذیه کنیم، به هم میچسباند. بیایید فقط کد زیر را در قسمت کپی کنیم resources\views\welcome.blade.php فایل:
Laravel + Vue Chat
@vite([‘resources/js/app.js’])
نوشته شده توسط روزاریو دی کیارا✏️
Laravel Reverb یک چارچوب وب سوکت بلادرنگ است که رویدادها را از لاراول به فرانتاند پخش میکند. این امکان همگام سازی بلادرنگ داده ها را در بین مشتریان متصل بدون بارگیری مجدد صفحه فراهم می کند. Vue یک چارچوب جاوا اسکریپت است که اجازه می دهد تا یک تجربه ظاهری واکنشی و مبتنی بر مؤلفه داشته باشید.
در این راهنما، ساختن یک برنامه چت کاملاً کاربردی و بلادرنگ را با استفاده از باطن Laravel Reverb و Frontend واکنشی Vue بررسی خواهیم کرد. طبق معمول، کد نهایی و عملکردی در این مخزن GitHub موجود است.
راه اندازی پیش نیازهای Laravel و Vue
قبل از شروع توسعه، باید محیطی متشکل از دو مؤلفه راه اندازی کنید: لاراول که مبتنی بر PHP است و مؤلفه Vue/Node.
- PHP: نسخه 8.2 یا بالاتر (اجرا شود
php -v
برای بررسی نسخه) - آهنگساز (اجرا
composer
برای بررسی وجود آن) - Node.js: نسخه 20 یا بالاتر (اجرا شود
node -v
برای بررسی نسخه)
در تصویر زیر می توانید خروجی دستور بالا را در دستگاه ویندوز من مشاهده کنید:
برای پایگاه داده، ما از SQLite استفاده خواهیم کرد، پس حتما آن را در خود فعال کنید php.ini
فایل هنگامی که تمام پیش نیازهای اساسی را برآورده کردید، می توانید با استفاده از موارد زیر یک پروژه لاراول ایجاد کنید:
> composer create-project laravel/laravel:^11.0 laravel_chat_demo
پس از آماده سازی ریشه پروژه خود برای شروع توسعه، ممکن است نیاز به نصب برخی الزامات بیشتری داشته باشید. این فرآیند به محیط خاص شما بستگی دارد، اما، به طور کلی، سعی کنید خود را بسازید composer
دستور happy (🙂)، اگر شکایت کرد (یا فقط به شما هشدار داد) که بسته ای از دست رفته است، آن بسته را نصب کنید (Google دوست شماست).
وقتی همه چیز درست شد، باید بتوانید موارد زیر را اجرا کنید:
> php artisan serve
این محیط توسعه شما را روشن می کند.
ساخت مدل داده برای پیام های چت
اکنون که محیط توسعه (امیدوارم) خوب است، میتوانیم روی بخش محرک توسعه تمرکز کنیم.
ما در حال نوشتن یک برنامه وب چت هستیم تا بتوانیم انتظار مدیریت پیام ها را داشته باشیم. با دستور زیر یک کلاس کاملاً جدید در قسمت دریافت می کنیم /app/Models
که نشان دهنده پیام های رد و بدل شده در چت ما خواهد بود:
> php artisan make:model -m Message
در حال حاضر کلاس خالی است. ما آن را با داده ها و عملکردها تخصصی خواهیم کرد، بنابراین فایل را جایگزین کنید Message.php
با کد زیر:
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class Message extends Model
{
use HasFactory;
public $table = 'messages';
protected $fillable = ['id', 'user_id', 'text'];
public function user(): BelongsTo
{
return $this->belongsTo(User::class, 'user_id');
}
public function getTimeAttribute(): string
{
return date(
"d M Y, H:i:s",
strtotime($this->attributes['created_at'])
);
}
}
کد بالا پیامی را در سیستم ما توصیف می کند: پیام ها در جدولی که نامش ذکر شده ذخیره می شود messages
; هر پیام شامل سه قسمت است: id
، user_id
، و text
. بقیه کد دو کار را انجام می دهد: تابعی ایجاد می کند که کد را برمی گرداند user
مرتبط با پیام با استفاده از BelongsTo
صفت، و تابعی را تعریف می کند که فیلد را قالب بندی می کند created_at
در قالب تاریخ و زمان قابل خواندن برای انسان. در بالای هر پیام در کادر چت استفاده خواهد شد.
مدلی که ما نوشتیم به Eloquent (ORM لاراول) نحوه تعامل با داده های پایگاه داده خود را آموزش می دهد، مرحله بعدی ایجاد جدول در پایگاه داده است. برای انجام این کار ما به یک مهاجرت نیاز داریم، یعنی قطعه ای از کد که جدول را ایجاد می کند:
> php artisan make:migration create_message_table
با این کار یک فایل مهاجرت خالی ایجاد می شود database\migrations\
که نامش چیزی شبیه به
. فایل شامل دو روش کلیدی است: up
و down
. این up
متد تغییراتی را در طرح پایگاه داده شما ایجاد می کند، مانند ایجاد جداول جدید، اضافه کردن ستون ها یا ایجاد نمایه ها.
برعکس، down
نقش متد خنثی کردن یا معکوس کردن تغییرات ایجاد شده توسط مربوطه است up
روش، به طور موثر به شما امکان می دهد در صورت نیاز تغییرات را به عقب برگردانید. ما این فایل را با کد زیر تخصصی می کنیم:
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up(): void {
Schema::create('messages', function (Blueprint $table) {
$table->id();
$table->timestamps();
$table->foreignId('user_id')->constrained();
$table->text('text')->nullable();
});
}
public function down(): void {
Schema::dropIfExists('messages');
}
};
این انتقال یک جدول پیام های جدید را با چند فیلد تعریف می کند: شناسه افزایش خودکار به عنوان کلید اصلی، user_id
که به جدول کاربران برای پیوند دادن پیام ها با فرستنده آنها و یک فیلد متنی برای ذخیره محتوای پیام ارجاع می دهد.
این جدول همچنین دارای ستونهای مهر زمانی است تا زمان ایجاد و تغییر خودکار هر پیام را ردیابی کند. مهرهای زمانی این دو فیلد را ایجاد خواهند کرد created_at
و updated_at
. به عنوان یک اقدام احتیاطی، این عملیات شامل یک روش معکوس است که میتواند در صورت نیاز جدول پیامها را حذف کند و امکان بازگشت آسان این تغییرات را فراهم کند.
در این مرحله، بیایید موارد زیر را اجرا کنیم:
> php artisan migrate:fresh
با این کار یک جدول جدید در پایگاه داده ایجاد می شود. اگر می خواهید بررسی کنید که موفقیت آمیز بوده است، به سادگی آن را باز کنید database\database.sqlite
فایل
افزودن ثبت نام و ورود کاربر
اکنون که فضایی برای دادهها داریم، نوبت به ایجاد فرانتاند رسیده است. هنگام توسعه رابط کاربری برای یک برنامه لاراول، شما دو گزینه اصلی دارید: اولی شامل استفاده از PHP برای ساخت ظاهر خود است. در مقابل، دومی از چارچوب های جاوا اسکریپت مانند Vue یا React استفاده می کند.
ما در این مقاله از Vue استفاده خواهیم کرد. این همچنین به توسعه دهندگان امکان می دهد از اکوسیستم بسته های عظیم و ابزارهای موجود از طریق npm استفاده کنند. ابتدا باید بسته مناسب را نصب کنیم:
> composer require laravel/ui
یک بار laravel/ui
بسته نصب شده است، می توانید داربست جلویی را با استفاده از آن نصب کنید artisan
دستور: دستور زیر رابط کاربری را برای مدیریت ثبت نام و ورود به برنامه وب ما ایجاد می کند. فقط در نظر بگیرید که این کار چقدر می تواند پیچیده باشد اگر باید این را از ابتدا بنویسید و چقدر آسان است که در لاراول انجام می شود:
> php artisan ui vue --auth
در این مرحله، ما دو نیمه پروژه را داریم: PHP در حال حاضر با دستور PHP artisan serve در حال اجرا است. اکنون زمان اجرای بخش مبتنی بر جاوا اسکریپت است:
> npm install
برای اینکه هر دو قسمت در حال اجرا باشند، دو پنجره پوسته را باز کنید. یکی در حال اجرا artisan
دستور و دیگری با دستور زیر:
> npm run dev
این دستور جلوی صفحه را در حال اجرا نگه میدارد و هر بار که آن را تغییر میدهیم دوباره آن را بارگیری میکند.
در پایان این فرآیند، بدون نوشتن یک خط کد، یک وب سایت کاملاً کاربردی با امکان مدیریت احراز هویت کاربر داریم. برای ثبت نام کاربر جدید به http://127.0.0.1:8000/register بروید و وارد وبسایت شوید:
پیکربندی مسیرها برای API پیام چت
اکنون، باید مسیرهایی را برای API های مختلفی که قرار است میزبانی کنیم اضافه کنیم:
-
/home
برای صفحه اصلی – این باید از قبل وجود داشته باشد -
/message
، یک روش POST HTTP برای افزودن یک پیام جدید -
/messages
برای دریافت تمام پیام های موجود
را اصلاح خواهیم کرد /routes/web.php
به شرح زیر
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\HomeController;
Route::get("https://dev.to/", 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');
اکنون زمان نوشتن است HomeController
که API هایی را که در بالا توضیح دادیم پیاده سازی می کند:
namespace App\Http\Controllers;
use App\Jobs\SendMessage;
use App\Models\Message;
use App\Models\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class HomeController extends Controller
{
public function __construct()
{
$this->middleware('auth');
}
public function index()
{
$user = User::where('id', auth()->id())->select([
'id',
'name',
'email',
])->first();
return view('home', [
'user' => $user,
]);
}
public function messages(): JsonResponse
{
$messages = Message::with('user')->get()->append('time');
return response()->json($messages);
}
public function message(Request $request): JsonResponse
{
$message = Message::create([
'user_id' => auth()->id(),
'text' => $request->get('text'),
]);
SendMessage::dispatch($message);
return response()->json([
'success' => true,
'message' => "Message created and job dispatched.",
]);
}
}
در اینجا می توانید منطق پشت APIهایی که در بالا توضیح داده شد را مشاهده کنید:
- در
/home
روش، ما اطلاعات کاربر وارد شده را از پایگاه داده با استفاده از بازیابی می کنیمUser
مدل کنید و آن را به نمایش منتقل کنید - در
/messages
روش، ما همه پیام ها را از پایگاه داده از طریق واکشی می کنیمMessage
مدل، شامل داده های کاربر مرتبط، اضافه کردنtime
فیلد (با استفاده از یک Accessor) برای هر کدامmessage
و مجموعه کامل را به view ارسال کنید - در
/message
روش، ما یک روش جدید ایجاد خواهیم کردmessage
در پایگاه داده با استفاده ازMessage
مدل و ارسال کنیدSendMessage
کار صف
وقتی همه چیز تنظیم شد، میتوانیم رویدادهای لاراول و کارهای صف را برای میزبانی تبادل و همگامسازی پیامها نصب و پیکربندی کنیم.
پیکربندی رویداد لاراول و کار صف
سیستمهای شغلی رویداد و صف لاراول ابزارهای قدرتمندی را برای انجام وظایف ناهمزمان و جداسازی بخشهای مختلف یک برنامه ارائه میکنند.
رویدادها به شما این امکان را می دهند که اعمال یا تغییرات خاصی را در برنامه خود تعریف و پخش کنید، که شنوندگان می توانند سپس به آنها پاسخ دهند. مشاغل صف به شما امکان میدهند کارهای زمانبر، مانند ارسال ایمیل یا پردازش مجموعههای داده بزرگ، را برای کارمندان پسزمینه بارگذاری کنید، و اطمینان حاصل کنید که برنامه شما پاسخگو و کارآمد باقی میماند.
این ویژگیها با هم، مقیاسپذیری را افزایش میدهند و تجربه کلی کاربر را با مدیریت فرآیندها در پسزمینه بهبود میبخشند. ما از هر دو استفاده خواهیم کرد: event
اساسا یک محفظه داده است که پیام را نگه می دارد و QueueListener
تعداد پیام هایی که منتظر ارسال هستند را کنترل می کند.
با دستور زیر، ما را تولید می کنیم Event
کلاس در /app/Events
دایرکتوری:
> php artisan make:event GotMessage
سپس ما باید دو چیز را پیاده سازی کنیم: سازنده ای که توصیف می کند بار این رویداد چیست و broadcastOn()
روشی برای تعیین اینکه این رویدادها در کدام کانال پخش شوند:
namespace App\Events;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class GotMessage implements ShouldBroadcast {
use Dispatchable, InteractsWithSockets, SerializesModels;
public function __construct() {
}
public function broadcastOn() {
return new PrivateChannel("channel_for_everyone");
}
}
نام کانال (“channel_for_everyone
“) در فایلی که WebSocket را توصیف می کند (به زیر مراجعه کنید) استفاده می شود که کانال ارتباطی بین هر نمونه از کلاینت چت و سرور را نشان می دهد. در اینجا توجه داشته باشید که سازنده هیچ پارامتری را نمی گیرد و هیچ اشاره ای به پیام ها ندارد: ایده این است که این رویداد زمانی پخش می شود که یک پیام جدید ارسال شود، هنگامی که مشتری آن را دریافت کرد، آنها فقط لیست به روز شده پیام ها را با استفاده از خدماتی که قبلا پیاده سازی کرده بودیم به سرور درخواست می کنند.
برای تولید QueueListener
، از موارد زیر استفاده می کنیم:
> php artisan make:job SendMessage
این دستور تولید می کند SendMessage.php
فایل در /app/Jobs
دایرکتوری این فایل به چارچوب لاراول آموزش می دهد که چگونه نمونه های جدید ایجاد شده را مدیریت کند GotMessage
رویدادی که قبلا تعریف کردیم:
namespace App\Jobs;
use App\Events\GotMessage;
use App\Models\Message;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class SendMessage implements ShouldQueue {
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public function __construct(public Message $message) {
//
}
public function handle(): void {
GotMessage::dispatch([
'id' => $this->message->id,
'user_id' => $this->message->user_id,
'text' => $this->message->text,
'time' => $this->message->time,
]);
}
}
این handle()
روش ارسال می کند GotMessage
رویداد با جزئیاتی مانند پیام id
، user_id
، text
، و timestamp
. این کار به گونهای طراحی شده است که در پسزمینه، رویدادها را تا زمانی که در کانال قرار میگیرند بهصورت ناهمزمان پردازش کند، و امکان مدیریت کارآمد وظایف ارسال پیام در پسزمینه را فراهم میکند. همانطور که می بینید، عمومی وجود دارد $message
ویژگی به عنوان آرگومان سازنده؛ این به اجرای کارآمدتر فرآیند صف کمک می کند (برای جزئیات بیشتر به مستندات مراجعه کنید).
با وجود تمام اجزای دیگر، اکنون فقط باید عنصر PHP نهایی را برای پروژه اضافه کنیم: WebSocket.
اضافه کردن Laravel Reverb
Laravel Reverb یک فریم ورک بلادرنگ WebSocket را ارائه میکند که به شما امکان میدهد رویدادها را از برنامه لاراول خود با استفاده از WebSockets به فرانتاند ارسال کنید. با Reverb، امکان پخش رویدادهایی که در بالا تعریف کردیم، در هر کلاینت متصل منعکس شده است، بدون نیاز به بارگذاری مجدد صفحه. طبق معمول، افزودن این ویژگی بسیار پیچیده با یک دستور ساده انجام می شود:
> php artisan install:broadcasting
با پذیرفتن گزینه پیش فرض، هم قسمت PHP برای backend و هم وابستگی Node را برای استفاده در frontend نصب می کند.
اجرای این دستور چندین تغییر در دایرکتوری پروژه شما ایجاد می کند: یک بخش جدید به آن اضافه می کند .env
فایل برای Reverb، ایجاد یک reverb.php
فایل در /config
برای خواندن این فیلدهای جدید، و مهمتر از همه، اضافه کردن یک channels.php
فایل در /routes
. در این channels.php
Reverb را برای ایجاد آن پیکربندی می کنیم channel_for_everyone
کانال را با اضافه کردن کد زیر:
Broadcast::channel('channel_for_everyone', function ($user) {
return true;
});
در این مرحله، همه چیز در قسمت پشتیبان سر جای خود است. اکنون میتوانیم روی قسمت جلویی تمرکز کنیم.
ساخت جلویی Vue
در این بخش، یک ظاهر ساده با تمرکز بر عملکرد و یکپارچگی، بدون استایل، سفارشی سازی فونت و غیره طراحی می کنیم.
اولین قدم تنظیم محیط Vue است:
> npm install vue vue-router @vitejs/plugin-vue```
{% endraw %}
Now we can focus on three files to integrate a Vue template in Laravel. The first one is {% raw %}`resources/js/app.js`{% endraw %}, which will instantiate the Vue component that contains our app:
{% raw %}
```javascript
import './bootstrap';
import App from './App.vue'
import { createApp } from 'vue';
const app = createApp({});
app.component('app', App);
app.mount("#app");
کد ساده است: App.vue
الگوی Vue ما است و ما فقط آن را با div
که id
است #app
در blade
فایل (به قطعه کد بعدی مراجعه کنید) که برنامه وب ما را رندر می کند. فایل بعدی است resources/js/App.vue
، که شامل قالب است:
<script setup>
const props = defineProps({
isAuth: {
type: Boolean,
default: false
},
user: {
type: [Object, Array],
required: false
}
})
</script>
<template>
<h1>Hello, {{ user.name }}</h1>
</template>
کد دو کار را انجام می دهد: آن را تعریف می کند props
برای Vue برای میزبانی مقادیری که از لاراول می آیند، و سپس یک پیام ساده نمایش می دهد. همانطور که می بینید، ما به تازگی احراز هویت فعلی را دریافت کردیم user
و آنها را نشان دهند name
.
آخرین فایل این است blade
که مؤلفه Vue و دادههایی را که میخواهیم به آن تغذیه کنیم، به هم میچسباند. بیایید فقط کد زیر را در قسمت کپی کنیم resources\views\welcome.blade.php
فایل:
Laravel + Vue Chat
@vite(['resources/js/app.js'])