طريقة استخدام Event و Listener في منصة Laravel

shqawe

ربي أشرح لي صدري
طاقم الإدارة
إنضم
27 يونيو 2019
المشاركات
3,370
مستوى التفاعل
2,918
النقاط
113
الإقامة
K.S.A
  • التقييمات: 0
  • #1
بسم الله الرحمن الرحيم

الحمد لله والصلاة والسلام على رسول الله نبينا محمد عليه افضل الصلاة وأتم التسليم

اللهم لا علم لنا إلا ما علمتنا، إنك أنت العليم الحكيم، اللهم علمنا ما ينفعنا، وانفعنا بما علمتنا، وزدنا علما،

اقدم لكم اليوم طريقة استخدام ال event مع listener في منصة laravel والتي يغفل عنها الكثير او يتجنبوها في برمجياتهم لذا احببت ان اطرح هذه الطريقة لعل ّ وعسى ان يستفيد منها من ﻻ يعرفها

ملاحظة: يتطلب الدرس الى معرفة في منصة Laravel ﻻن الدرس يعتبر من الدروس المتقدمة.

لنأخذ فكرة اوﻻ عن ماهو event ال event عبارة عن حدث يتم تنفيذه في وقت محدد او بعد عملية محددة فائدة اﻻساسية حسب استخدامي له وفهمي هي اعادة استخدام هذا الحدث مرة أخرى

ولتوضيح الصورة اكثر لنأخذ مثال على كود ﻻ يستخدم ال event ومن ثم نقوم باستخدام ال event ونرى كيف سوف يكون الكود



PHP:
public function contactUs(Request $request)
    {
        $data = [
            'name' => $request->input('name'),
            'title' => $request->input('title'),
            'subject' => $request->input('subject'),
            'message' => $request->input('message'),
        ];

        $contact = new Contact::create($data);
        if($contact)
        {
            Mail::to("[email protected]")->send($data);
            $res['success'] = $data;
        }else{
            $res['error'] = 'حدث خطأ ولم يتم ارسال رسالتك. الرجاء المحاولة مرة أخرى';
        }

        return response()->json($res);
    }

وهو كود خاص بنموذج اتصل بنا يقوم بادخال البيانات الى قاعدة البيانات واذا نجح ادخال البيانات يقوم بارسال بريد الكتروني بمعلومات الرسالة

طبعا ً ﻻن الكود عبارة عن مثال فممكن ان ترى ان الكود بسيط وﻻ يحتاج الى تعديل ولكن احيانا ً قد يكون الكود اكثر من 30 الى 50 سطر لذلك هناك قاعدة عند استخدام MVC تقول ﻻبد ان يكون المتحكم او الكنترول Controller بسيط ونظيف simple and clean لذا حاول قدر اﻻمكان عند استخدام الفريم ورك الى تبسيط المتحكمات ليسهل قرائتها


اﻻن سوف اقوم بكتابة نفس الكود ولكن باستخدام ال event لكي اريكم النتيجة النهائية كيف ستكون:

PHP:
public function contactUs(Request $request)
    {
        $data =  event(new ContactUsEvent($request->input()));
        return response()->json($data);
    }


كما تشاهدون اصبح كودنا السابق مجرد سطرين فقط وهذا بعد استخدامنا لل event في السطر اﻻول فقط لذا دعونا اﻻن نبدأ في تطبيق الخطوات لتحويل الكود اﻻول للكود الثاني:

اوﻻ ً سوف نحتاج الى انشاء event ويتم ذلك في laravel عن طريق شاشة اﻻوامر بكتابة هذا اﻻمر


كود:
php artisan make:event ContactUsEvent

بعد تنفيذ هذا الامر سوف يتم انشاء مجلد باسم Events داخل مجلد app وسوف تجد بداخله ملف باسم ContactUsEvent.php وهذا هو ملف ال event الخاص بنموذج اﻻتصال بنا عند فتح الملف سوف دالتين نقوم بمسح الدالة الثانية ونبقي دالة __construct ليكون الشكل النهائي للملف بهذا الشكل

PHP:
<?php

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class ContactUsEvent
{
    use Dispatchable, InteractsWithSockets, SerializesModels;


    public $data;

    public function __construct($data)
    {

        $this->data = $data;
    }

}

تلاحظون اننا قمنا بتمرير المتغير $data وهو المتغير $request->input() الذي قمنا بتمريره لل event في الكنترول عن طريق هذا الكود

PHP:
$data =  event(new ContactUsEvent($request->input()));

وهذا كل ما نحتاجه ﻻنشاء ال event فال event ببساطة عبارة عن ملف ربط بين ال controller و listener

اﻻن نقوم بانشاء ال lestener وهو الملف الذي سوف يشمل جميع العمليات التي قمنا بها في ال controller ولانشاء ال listener في laravel يتم كتابة هذا الكود في شاشة اﻻوامر بالطريقة التالية:

PHP:
php artisan make:listener ContactUsListener

ومثل ما حدث مع ال event سوف تلاحظون انه تم انشاء مجلد Listeners داخل مجلد app وبداخله ملف ContactUsListener.php الخاص بنا

في ملف ال listener سوف تجد دالتين اﻻولى __construct والثانية handle وهي ماسوف نتعامل معها ويمكنكم حذف الدالة اﻻولى واﻻبقاء على الثانية او كما تحبون

اﻻن لنأخذ الدالة الثانية وسوف تكون بالشكل التالي:

PHP:
public function handle($event)
    {
        
    }

سوف تجدون ان هناك متغير باسم $event وهذا المتغير هو المتغير الذي تم تمريره من ملف ال event في دالة __construct($data) والذي يحمل قيمة المتغير الذي تم تمريره من الكنترول عن طريق هذا الكود

PHP:
event(new ContactUsEvent($request->input()))

اﻻن نقوم بنقل الكود من الكنترول controller الى ال event ليصبح بهذا الشكل

PHP:
public function handle($event)
    {
        $data = [
            'name' => $event->input('name'),
            'title' => $event->input('title'),
            'subject' => $event->input('subject'),
            'message' => $event->input('message'),
        ];

        $contact = new Contact::create($data);
        if($contact)
        {
            Mail::to("[email protected]")->send($data);
            $res['success'] = $data;
        }else{
            $res['error'] = 'حدث خطأ ولم يتم ارسال رسالتك. الرجاء المحاولة مرة أخرى';
        }
        
        return $res;

        
    }

تلاحظون اننا قمنا بنقل الكود من controller الى ال event كما هو ما عادا اننا قمنا بتغير المتغير $request الى $event وهذا فقط ما تم تغييره

وبهذا يكون تم اﻻنتهاء من ال listener تبقى نقطة اخيرة اﻻ وهي تسجيل ال event وال listener لكي تتعرف عليهم laravel ونستطيع استخدامهم ويتم ذلك عن طريق ملف EventServiceProvider.php الموجود في على هذا المسار App\Providers نقوم بفتح الملف ونضيف هذا الكود في الدالة register بهذا الشكل

PHP:
ContactUsEvent::class => [
            ContactUsListener::class,
        ],

والى هنا يكون تم اﻻنتهاء من استخدام ال event وتقليل الكود في الكنترول ليكون متبع نظريقة بسيط ونظيف

في النهاية ممكن يجي واحد ويقول ليش الحوسة ووجع الراس وننقل الكود من مكان الى مكان فخلاص خلي الكود في الكنترول وانتهينا

اقوله ببساطة لنفرض ان جاء مبرمج غيرك وحب انه يضيف عملية بعد ما يتم ارسال ايميل او بعد ادخال المعلومات الى قاعدة البيانات فلو كنت مستخدم الكنترول فقط فليس للمبرمج طريقة الا انه يعدل على الكنترول وبكذا لو اصدرت اي تحديث جديد راح يتم فقد التعديلات اللي عملها المبرمج وراح يضطر يرجع يعدل من جديد على نفس الكود اما بطريقة ال event فكل اللي عليه ببساطه انه ينشأ ملف listener ويضيف العملية تبعه اللي يحتاج انها تتم في هذا الملف بعد كذا يضيف ال listener تبعه في قائمة listeners مثل ماعملنا في اخر خطوة ويكون بالطريقة هذي لو فرضنا ان ال listener اسمه SecondEvent

PHP:
ContactUsEvent::class => [
            ContactUsListener::class,
            SecondEvent::class,
        ],

وبكذا حتى لو تحديث البرنامج وتم اصدار جديد فلن يتم تغير العمل الخاص بك ويبقى يعمل بدون مشاكل

اتمنى اني وفقت في شرح الطريقة والطريقة كما ذكرت سابقا ً هي موجهه للمتمكنين من منصة Laravel وان اخطأت في نقطة او لم اوضحها بالشكل المناسب فانا تحت امركم لتصحيحها او توضيحها كما تحبون

ان اصبت فهذا من فضل الله علي وان اخطأت جل من ﻻ يخطأ

وتقبلوا احترامي وتقديري
اخوكم
شقاوي
 

MesterPerfect

:: مراقب زين العربية ::
طاقم الإدارة
إنضم
28 يناير 2019
المشاركات
2,721
مستوى التفاعل
2,180
النقاط
113
العمر
24
الإقامة
sohag, Egypt
الموقع الالكتروني
شرح مميز جدا
بارك الله فيك أخي شقاوي
تحياتي لك
 

Alrajabane

◥ ツواحد من الناسツ ◤
طاقم الإدارة
إنضم
28 يناير 2019
المشاركات
1,112
مستوى التفاعل
784
النقاط
113
الإقامة
السعودية
الموقع الالكتروني
يامال العافية اخوي تركي .
شرح وافي وكافي يالغالي ..
 

shqawe

ربي أشرح لي صدري
طاقم الإدارة
إنضم
27 يونيو 2019
المشاركات
3,370
مستوى التفاعل
2,918
النقاط
113
الإقامة
K.S.A

ALASEEL

:: الأعضاء ::
إنضم
7 يناير 2021
المشاركات
29
مستوى التفاعل
25
النقاط
13
الإقامة
غزة
يعطيك الف عافية اخي شقاوي

شرح مميز كصاحبه
 

shqawe

ربي أشرح لي صدري
طاقم الإدارة
إنضم
27 يونيو 2019
المشاركات
3,370
مستوى التفاعل
2,918
النقاط
113
الإقامة
K.S.A
حياك الله اخوي اﻻصيل نورت الموضوع ياغالي 😘
 

جميع المواضيع والمشاركات والتعليقات المكتوبة تعبّر عن وجهة نظر صاحبها ,, ولا تعبّر بأي شكل من الاشكال عن وجهة نظر إدارة زين العربية .ولا نتحمل أي مسؤولية قانونية حيال ذلك :: يتحمل كاتبها مسؤولية النشر ::

الأعضاء المتصلون

لا يوجد أعضاء متصلون الآن.

إحصائيات المنتدى

المواضيع
2,093
المشاركات
22,026
الأعضاء
984
آخر عضو مسجل
mabdelwanis
أعلى