- التقييمات: 0
- #1
بسم الله الرحمن الرحيم
الحمد لله والصلاة والسلام على رسول الله نبينا محمد عليه افضل الصلاة وأتم التسليم
اللهم لا علم لنا إلا ما علمتنا، إنك أنت العليم الحكيم، اللهم علمنا ما ينفعنا، وانفعنا بما علمتنا، وزدنا علما،
اقدم لكم اليوم طريقة استخدام ال event مع listener في منصة laravel والتي يغفل عنها الكثير او يتجنبوها في برمجياتهم لذا احببت ان اطرح هذه الطريقة لعل ّ وعسى ان يستفيد منها من ﻻ يعرفها
ملاحظة: يتطلب الدرس الى معرفة في منصة Laravel ﻻن الدرس يعتبر من الدروس المتقدمة.
لنأخذ فكرة اوﻻ عن ماهو event ال event عبارة عن حدث يتم تنفيذه في وقت محدد او بعد عملية محددة فائدة اﻻساسية حسب استخدامي له وفهمي هي اعادة استخدام هذا الحدث مرة أخرى
ولتوضيح الصورة اكثر لنأخذ مثال على كود ﻻ يستخدم ال event ومن ثم نقوم باستخدام ال event ونرى كيف سوف يكون الكود
وهو كود خاص بنموذج اتصل بنا يقوم بادخال البيانات الى قاعدة البيانات واذا نجح ادخال البيانات يقوم بارسال بريد الكتروني بمعلومات الرسالة
طبعا ً ﻻن الكود عبارة عن مثال فممكن ان ترى ان الكود بسيط وﻻ يحتاج الى تعديل ولكن احيانا ً قد يكون الكود اكثر من 30 الى 50 سطر لذلك هناك قاعدة عند استخدام MVC تقول ﻻبد ان يكون المتحكم او الكنترول Controller بسيط ونظيف simple and clean لذا حاول قدر اﻻمكان عند استخدام الفريم ورك الى تبسيط المتحكمات ليسهل قرائتها
اﻻن سوف اقوم بكتابة نفس الكود ولكن باستخدام ال event لكي اريكم النتيجة النهائية كيف ستكون:
كما تشاهدون اصبح كودنا السابق مجرد سطرين فقط وهذا بعد استخدامنا لل event في السطر اﻻول فقط لذا دعونا اﻻن نبدأ في تطبيق الخطوات لتحويل الكود اﻻول للكود الثاني:
اوﻻ ً سوف نحتاج الى انشاء event ويتم ذلك في laravel عن طريق شاشة اﻻوامر بكتابة هذا اﻻمر
بعد تنفيذ هذا الامر سوف يتم انشاء مجلد باسم Events داخل مجلد app وسوف تجد بداخله ملف باسم ContactUsEvent.php وهذا هو ملف ال event الخاص بنموذج اﻻتصال بنا عند فتح الملف سوف دالتين نقوم بمسح الدالة الثانية ونبقي دالة
تلاحظون اننا قمنا بتمرير المتغير
وهذا كل ما نحتاجه ﻻنشاء ال event فال event ببساطة عبارة عن ملف ربط بين ال controller و listener
اﻻن نقوم بانشاء ال lestener وهو الملف الذي سوف يشمل جميع العمليات التي قمنا بها في ال controller ولانشاء ال listener في laravel يتم كتابة هذا الكود في شاشة اﻻوامر بالطريقة التالية:
ومثل ما حدث مع ال event سوف تلاحظون انه تم انشاء مجلد Listeners داخل مجلد app وبداخله ملف ContactUsListener.php الخاص بنا
في ملف ال listener سوف تجد دالتين اﻻولى
اﻻن لنأخذ الدالة الثانية وسوف تكون بالشكل التالي:
سوف تجدون ان هناك متغير باسم
اﻻن نقوم بنقل الكود من الكنترول controller الى ال event ليصبح بهذا الشكل
تلاحظون اننا قمنا بنقل الكود من controller الى ال event كما هو ما عادا اننا قمنا بتغير المتغير
وبهذا يكون تم اﻻنتهاء من ال listener تبقى نقطة اخيرة اﻻ وهي تسجيل ال event وال listener لكي تتعرف عليهم laravel ونستطيع استخدامهم ويتم ذلك عن طريق ملف
والى هنا يكون تم اﻻنتهاء من استخدام ال event وتقليل الكود في الكنترول ليكون متبع نظريقة بسيط ونظيف
في النهاية ممكن يجي واحد ويقول ليش الحوسة ووجع الراس وننقل الكود من مكان الى مكان فخلاص خلي الكود في الكنترول وانتهينا
اقوله ببساطة لنفرض ان جاء مبرمج غيرك وحب انه يضيف عملية بعد ما يتم ارسال ايميل او بعد ادخال المعلومات الى قاعدة البيانات فلو كنت مستخدم الكنترول فقط فليس للمبرمج طريقة الا انه يعدل على الكنترول وبكذا لو اصدرت اي تحديث جديد راح يتم فقد التعديلات اللي عملها المبرمج وراح يضطر يرجع يعدل من جديد على نفس الكود اما بطريقة ال event فكل اللي عليه ببساطه انه ينشأ ملف listener ويضيف العملية تبعه اللي يحتاج انها تتم في هذا الملف بعد كذا يضيف ال listener تبعه في قائمة listeners مثل ماعملنا في اخر خطوة ويكون بالطريقة هذي لو فرضنا ان ال listener اسمه SecondEvent
وبكذا حتى لو تحديث البرنامج وتم اصدار جديد فلن يتم تغير العمل الخاص بك ويبقى يعمل بدون مشاكل
اتمنى اني وفقت في شرح الطريقة والطريقة كما ذكرت سابقا ً هي موجهه للمتمكنين من منصة Laravel وان اخطأت في نقطة او لم اوضحها بالشكل المناسب فانا تحت امركم لتصحيحها او توضيحها كما تحبون
ان اصبت فهذا من فضل الله علي وان اخطأت جل من ﻻ يخطأ
وتقبلوا احترامي وتقديري
اخوكم
شقاوي
الحمد لله والصلاة والسلام على رسول الله نبينا محمد عليه افضل الصلاة وأتم التسليم
اللهم لا علم لنا إلا ما علمتنا، إنك أنت العليم الحكيم، اللهم علمنا ما ينفعنا، وانفعنا بما علمتنا، وزدنا علما،
اقدم لكم اليوم طريقة استخدام ال 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 وان اخطأت في نقطة او لم اوضحها بالشكل المناسب فانا تحت امركم لتصحيحها او توضيحها كما تحبون
ان اصبت فهذا من فضل الله علي وان اخطأت جل من ﻻ يخطأ
وتقبلوا احترامي وتقديري
اخوكم
شقاوي