اذهب إلى المحتوى

السؤال

Recommended Posts

  • 0
نشر

يمكن ذلك عن طريق الإستعانة بمفهوم الويب سوكيت . بحيث نقوم :

  • في الواجهة الخلفية للتطبيق بإنشاء قناة أو قنوات بحدث أو أحداث معينة . 
  • في الواجهة الأمامية للتطبيق بالإشتراك في هاته القنوات و الإستماع لهاته الأحداث . 

مثال عن الإستعمال : 

  1. لما يضغط عمر زر الإعجاب بمنشور أحمد سيتم إرسال طلب HTTP إلى الخادم .
  2. سيقوم الخادم بمعالجة طلب عمر و تسجيل الإعجاب , و في نفس الوقت سيقوم بإثارة الحدث المرتبط بالعملية و ليكن NewLikeEvent ضمن القناة AhmedChannel .
  3. أحمد مشترك في القناة AhmedChannel و يستمع لأية إثارة لأحداثها , ففي حالة إثارة أية حدث سيقوم بالتقاط البيانات التي تم تمريرها عبره دون تحديث الصفحة . 
  4. لما يتم إثارة الحدث NewLikeEvent ضمن القناة AhmedChannel ستقوم الواجهة الأمامية لأحمد بالتصرف بناء على البيانات التي تلتقطها عبر هاته القناة في هذا الحدث . كأن تقوم بإظهار إشعار أو  تنبيه نصي . 

قد نحتاج إلى دريفر لمساعدتنا في تمرير البيانات و إنشاء القنوات من مثل Pusher.

 و للتوضيح أكثر سنقوم بإستعمال Pusher كونه معدا مسبقا للعمل مع لارافل بشكل متسق , و هو ما سنقوم به في هذا المثال .. يمكن عمل الفكرة عن طريق المنطق التالي : 

  1. تثبيت حزمة خادم Pusher في تطبيق الللارافل :
    composer require pusher/pusher-php-server

     

  2. إنشاء تطبيق Pusher : نحتاج في هاته الخطوة إلى التسجيل في pusher.com و تسجيل تطبيق جديد .
  3. بعد ذلك سنحتاج نسخ معلومات التوثيق و نقوم بوضعها في ملف الإعداد env. كما يلي : 
    PUSHER_APP_ID=PUT_YOUR_PUSHER_ID_HERE
    PUSHER_APP_KEY=PUT_YOUR_PUSHER_KEY_HERE
    PUSHER_APP_SECRET=PUT_YOUR_PUSHER_SECRET_HERE
    PUSHER_APP_CLUSTER=PUT_YOUR_PUSHER_CLUSTER_HERE

    كما أنه يجب تغيير قيمة BROADCAST_DRIVER:

    BROADCAST_DRIVER=pusher

     

  4. نقوم بإنشاء حدث معين :

    php artisan make:event Notify

    سنلاحظ إضافة ملف Notify.php داخل مجلد events , لنتأكد من أنه سيتم تعديله ليكون على هذا النحو : 

    <?php
    
    namespace App\Events;
    
    use Illuminate\Broadcasting\Channel;
    use Illuminate\Queue\SerializesModels;
    use Illuminate\Broadcasting\PrivateChannel;
    use Illuminate\Broadcasting\PresenceChannel;
    use Illuminate\Foundation\Events\Dispatchable;
    use Illuminate\Broadcasting\InteractsWithSockets;
    use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
    
    class Notify implements ShouldBroadcast
    {
        use Dispatchable, InteractsWithSockets, SerializesModels;
        
        public $data;
      
        /**
         * هنا يتم التقاط أية بيانات و تسجيلها ضمن هذا الكائن
         *
         * @return void
         */
        public function __construct($passed_data)
        {
            $this->data = $passed_data;
        }
    
        /**
         * هنا يتم تعريف القنوات التي من المفترض أن ينتمي إليها هذا الحدث 
         *
         * @return \Illuminate\Broadcasting\Channel|array
         */
        public function broadcastOn()
        {
            return new Channel('notify-channel');
        }
    }

     

  5. إنشاء متحكم يختص بالعملية : 

    php artisan make:controller NotificationController

    ثم لنتأكد من وضع المحتوى التالي به : 

    <?php
    
    namespace App\Http\Controllers;
    
    use Illuminate\Http\Request;
    
    class NotificationController extends Controller
    {
        public function notify()
        {
            // تحضير مصفوفة بيانات لتمريرها
            $data['message'] = 'قم بتمرير هاته الرسالة';
            
            // Notify إثارة الحدث 
            event(new App\Events\Norify($data));
        }
    }

     

  6. سيكون علينا تعريف مسارين , مسار لإستهداف تابع المتحكم NotificationController و اخر لعرض الصفحة notification.blade.php :

    //web.php
    
    Route::get('notify','NotificationController@notify');
    Route::view('/notification', 'notification');

     

  7. ثم بملف ما بالواجهة الأمامية سيكون علينا فقط : الإشتراك في هاته القناة + الإستماع لأحداث هاته القناة : 

<!-- notification.blade.php --> 

<!DOCTYPE html>
<head>
  <title>مثال عن إشعار</title>
  
  <script src="https://js.pusher.com/4.1/pusher.min.js"></script>
  <script>
   
    // الإشتراك ضمن نفس تطبيق البوشر
   var pusher = new Pusher('{{env("MIX_PUSHER_APP_KEY")}}', {
      cluster: '{{env("PUSHER_APP_CLUSTER")}}',
      encrypted: true
    });
    
    // الاشتراك في نفس القناة
    var channel = pusher.subscribe('notify-channel');
    
    // Notify الاستماع للحدث 
    channel.bind('App\\Events\\Notify', function(data) {
      
      // إن تم اثارة الحدث قم بعرض البيانات
      alert(data.message);
    });
  </script>
</head>

بدون تحديث الصفحة سيكون علينا التصفح إلى المسار notify/ و سنلاحظ ظهور التنبيه في مسار notifications/ . المسار الأول يمثل الطلب الذي أرسله عمر , و المسار الثاني يمثل صفحة عرض الاشعارات بالنسبة لأحمد . و بالطبع فإن هذا هو الشكل الأبسط للعملية , يمكن تطوير العملية كأن نقوم بتخصيص طريقة العرض في قائمة إشعارات منظمة و منسدلة مع ظهور إشعار جانبي في كل إثارة للحدث , كما يمكن تخصيص قنوات خاصة بكل مستخدم منفرد أو نقوم بتمرير بيانات أخرى و تطبيق العديد من الأفكار عليها . 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...