إنشاء إشعارات عبر الويب باستخدام Laravel وقنوات Pusher: دليل عملي شامل
تُعتبر الإشعارات الفورية (Real-Time Notifications) من المكونات الأساسية في تطبيقات الويب الحديثة، إذ تُسهم بشكل كبير في تحسين تجربة المستخدم من خلال إعلامه بالأحداث الجديدة فور حدوثها، دون الحاجة إلى تحديث الصفحة. تقدم Laravel، إطار العمل الشهير بلغة PHP، دعمًا مدمجًا لإنشاء وبث الإشعارات الفورية باستخدام تقنيات مثل WebSockets بالتكامل مع خدمة Pusher.
هذا المقال يُقدم دليلاً مفصلاً حول كيفية إنشاء نظام إشعارات فورية على الويب باستخدام Laravel وقنوات البث الخاصة بـ Pusher، مع شرح عملي لجميع المكونات البرمجية المطلوبة من البداية حتى البث والاستقبال.
مفهوم الإشعارات الفورية في تطبيقات Laravel
تُمثل الإشعارات الفورية جزءًا من بنية التطبيقات الحديثة المتجاوبة مع الأحداث في الزمن الحقيقي. يعتمد هذا النوع من الإشعارات على استخدام بروتوكولات مثل WebSockets التي تُتيح للعميل (Client) الاستماع لقناة معينة وتلقّي البيانات بمجرد توفرها في الخادم (Server) دون الحاجة إلى إرسال طلب جديد في كل مرة.
في Laravel، تُستخدم حزمة Broadcasting لبث الأحداث، وتتكامل مع خدمات خارجية مثل Pusher، التي تُوفّر بنية تحتية جاهزة لـ WebSockets وتُسهّل عملية البث والاستقبال.
إعداد Laravel لدعم البث
1. تثبيت مشروع Laravel جديد
أول خطوة هي إعداد مشروع Laravel جديد باستخدام Composer:
bashcomposer create-project laravel/laravel laravel-pusher-demo
ثم الدخول إلى مجلد المشروع:
bashcd laravel-pusher-demo
2. إعداد ملف البيئة .env
يجب ضبط بعض المتغيرات في ملف البيئة لتفعيل ميزة البث وتحديد مزود الخدمة:
dotenvBROADCAST_DRIVER=pusher PUSHER_APP_ID=your-app-id PUSHER_APP_KEY=your-app-key PUSHER_APP_SECRET=your-app-secret PUSHER_HOST= PUSHER_PORT=443 PUSHER_SCHEME=https PUSHER_APP_CLUSTER=your-cluster
3. تثبيت مكتبة Pusher
لاستخدام Pusher، يجب تثبيت الحزمة الخاصة بها عبر Composer:
bashcomposer require pusher/pusher-php-server
4. تفعيل واجهة البث في Laravel
يجب التأكد من تفعيل واجهة البث في ملف config/app.php، عبر التحقق من وجود السطر التالي ضمن مصفوفة providers:
phpIlluminate\Broadcasting\BroadcastServiceProvider::class,
ثم تنفيذ الأمر التالي لإنشاء ملف broadcasting.php وتحديث الإعدادات:
bashphp artisan vendor:publish --tag=laravel-config
إعداد قنوات البث (Broadcast Channels)
1. إنشاء حدث للبث
يمكن إنشاء حدث باستخدام الأمر:
bashphp artisan make:event NewNotificationEvent
ثم تعديل الحدث ليقوم بالبث عبر القناة:
phpuse Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Queue\SerializesModels;
class NewNotificationEvent implements ShouldBroadcast
{
use InteractsWithSockets, SerializesModels;
public $message;
public function __construct($message)
{
$this->message = $message;
}
public function broadcastOn()
{
return new PrivateChannel('notifications');
}
public function broadcastWith()
{
return ['message' => $this->message];
}
}
2. إنشاء قناة مخصصة
تُسجل القنوات في ملف routes/channels.php. لتفعيل قناة الإشعارات، نضيف:
phpBroadcast::channel('notifications', function ($user) {
return true;
});
بث الإشعار من الخادم
يمكنك بث الإشعار باستخدام كود بسيط من داخل أي مكان في Laravel (مثل Controller أو Job):
phpuse App\Events\NewNotificationEvent;
event(new NewNotificationEvent('تم إضافة عنصر جديد'));
إعداد الجزء الأمامي (Front-End)
1. تثبيت مكتبات JavaScript المطلوبة
Laravel يأتي مدمجًا مع Laravel Echo، الذي يُستخدم للاستماع للأحداث. لتثبيت Echo وPusher:
bashnpm install --save laravel-echo pusher-js
2. إعداد Laravel Echo
في ملف resources/js/bootstrap.js:
javascriptimport 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
});
3. الاستماع للإشعار
في ملف JavaScript (مثلاً resources/js/app.js):
javascriptwindow.Echo.private('notifications')
.listen('NewNotificationEvent', (e) => {
console.log('إشعار جديد:', e.message);
alert(e.message);
});
إعداد المصادقة على القنوات الخاصة
لضمان أمان البث، يُفضل استخدام القنوات الخاصة. عند استخدام قناة مثل private-notifications، يجب تفعيل المصادقة في Laravel من خلال:
-
تفعيل Middleware
auth:apiأوauth:sanctumحسب طريقة المصادقة. -
إعداد ملفات JavaScript لتوفير التوكن المطلوب.
جدول تفصيلي يوضح علاقة مكونات البث
| المكون | الوصف |
|---|---|
| Event في Laravel | يُمثل الحدث الذي سيتم بثه إلى المستخدمين |
| ShouldBroadcast | واجهة تحدد أن الحدث يجب أن يُبث |
| broadcastOn() | تحدد القناة التي سيتم البث من خلالها |
| Pusher | خدمة خارجية تُتيح إرسال البيانات في الزمن الحقيقي عبر WebSockets |
| Laravel Echo | مكتبة JavaScript للاستماع للأحداث المرسلة من الخادم |
| قناة Private | قناة خاصة تتطلب مصادقة المستخدمين للاستماع إليها |
| ملف routes/channels.php | يُستخدم لتعريف من يُسمح له بالاستماع لقناة معينة |
استخدام نظام الإشعارات الأصلي في Laravel
يمكن أيضًا إنشاء إشعارات باستخدام نظام Laravel Notification، وربطها بالبث:
bashphp artisan make:notification NewMessageNotification
في ملف الإشعار:
phpuse Illuminate\Notifications\Notification;
use Illuminate\Notifications\Messages\BroadcastMessage;
public function via($notifiable)
{
return ['broadcast'];
}
public function toBroadcast($notifiable)
{
return new BroadcastMessage([
'message' => 'رسالة جديدة تم إرسالها'
]);
}
ثم يمكن إرسال الإشعار إلى المستخدم:
php$user->notify(new NewMessageNotification());
تخزين الإشعارات في قاعدة البيانات
لضمان توفر سجل بالإشعارات المرسلة، يمكن تفعيل خيار database مع broadcast:
phppublic function via($notifiable)
{
return ['database', 'broadcast'];
}
ولتخزينها، يجب إنشاء جدول الإشعارات:
bashphp artisan notifications:table php artisan migrate
استخدام Laravel Sanctum أو Passport للمصادقة في SPA
عند ربط Laravel بتطبيقات SPA أو تطبيقات JavaScript، يجب استخدام Laravel Sanctum أو Passport لتوفير المصادقة الآمنة للقنوات الخاصة.
في حالة Laravel Sanctum:
-
يجب تثبيته وتكوينه.
-
إرسال توكن المصادقة في ترويسات الطلبات.
الأمن والتحكم في الإشعارات
للتحكم في من يستطيع الاستماع للقنوات، يجب دائمًا استخدام القنوات الخاصة أو المؤمنة باستخدام التحقق من هوية المستخدم.
مثال على تحقق القناة:
phpBroadcast::channel('notifications.{userId}', function ($user, $userId) {
return (int) $user->id === (int) $userId;
});
التكامل مع واجهات المستخدم
يمكن عرض الإشعارات ضمن واجهة المستخدم باستخدام أدوات مثل Vue.js أو React، وربط Echo مباشرة بالعناصر الرسومية، مما يُتيح تجربة ديناميكية وتفاعلية:
vue{{ notification }}
مراجع
-
Laravel Documentation: Broadcasting
https://laravel.com/docs/broadcasting -
Pusher Documentation
https://pusher.com/docs

