معالجة أحداث event
webman/event
يوفر آلية أحداث رائعة، مما يسمح بتنفيذ بعض منطق الأعمال بدون تسلل إلى الشيفرة، مما يحقق فصل بين وحدات الأعمال. مثال نموذجي هو عندما يقوم مستخدم جديد بالتسجيل بنجاح، يكفي نشر حدث مخصص مثل user.register
، وستتلقى جميع الوحدات هذا الحدث لتنفيذ المنطق التجاري المناسب.
التثبيت
composer require webman/event
الاشتراك في الأحداث
يتم تكوين الاشتراك في الأحداث موحدًا عبر الملف config/event.php
<?php
return [
'user.register' => [
[app\event\User::class, 'register'],
// ...وظائف معالجة الأحداث الأخرى...
],
'user.logout' => [
[app\event\User::class, 'logout'],
// ...وظائف معالجة الأحداث الأخرى...
]
];
ملاحظة:
user.register
وuser.logout
إلخ هي أسماء الأحداث، نوعها سلسلة نصية، يفضل أن تكون كلمات صغيرة ومفصولة بنقطة (.
)- يمكن أن يرتبط حدث واحد بالعديد من وظائف معالجة الأحداث، ويتم استدعاءها بالترتيب المكون في التكوين
وظائف معالجة الأحداث
يمكن أن تكون وظائف معالجة الأحداث أي طريقة من طرق الفئة، أو دالة، أو دالة مغلقة، إلخ.
على سبيل المثال، إنشاء فئة معالجة الأحداث app/event/User.php
(إذا لم يكن الدليل موجودًا، يرجى إنشاؤه)
<?php
namespace app\event;
class User
{
function register($user)
{
var_export($user);
}
function logout($user)
{
var_export($user);
}
}
نشر الأحداث
استخدم Event::dispatch($event_name, $data);
أو Event::emit($event_name, $data);
لنشر حدث، على سبيل المثال
<?php
namespace app\controller;
use support\Request;
use Webman\Event\Event;
class User
{
public function register(Request $request)
{
$user = [
'name' => 'webman',
'age' => 2
];
Event::dispatch('user.register', $user);
}
}
هناك وظيفتان لنشر الأحداث، Event::dispatch($event_name, $data);
و Event::emit($event_name, $data);
والمعاملات متشابهة.
الفرق هو أن emit ستقوم بالتقاط الاستثناءات تلقائيًا، مما يعني أنه إذا كان هناك العديد من وظائف المعالجة لحدث واحد وحدث استثناء في إحدى الوظائف، فلن يؤثر ذلك على تنفيذ الوظائف الأخرى.
بينما dispatch لن يقوم بالتقاط الاستثناءات تلقائيًا، إذا حدث استثناء في أي من وظائف معالجة الحدث الحالي، فسيتم إيقاف تنفيذ الوظائف التالية وسيتم رفع الاستثناء مباشرة.
تنبيه
يمكن أن يكون المعامل$data
أي نوع من البيانات، مثل مصفوفة، أو مثيل فئة، أو سلسلة نصية، إلخ
الاستماع للأحداث باستخدام حرف البدل
يسمح التسجيل باستخدام حرف البدل بمعالجة عدة أحداث في نفس المستمع، على سبيل المثال، في ملف config/event.php
يمكن تكوين
<?php
return [
'user.*' => [
[app\event\User::class, 'deal']
],
];
يمكننا من خلال المعامل الثاني لوظيفة معالجة الأحداث $event_data
الحصول على اسم الحدث المحدد
<?php
namespace app\event;
class User
{
function deal($user, $event_name)
{
echo $event_name; // اسم الحدث المحدد، مثل user.register أو user.logout إلخ
var_export($user);
}
}
إيقاف بث الأحداث
عندما نعيد false
في وظيفة معالجة الأحداث، سيتوقف بث هذا الحدث
معالجة الأحداث بواسطة دالة مغلقة
يمكن أن تكون وظائف معالجة الأحداث طرق الفئة أو دوال مغلقة، على سبيل المثال
<?php
return [
'user.login' => [
function($user){
var_dump($user);
}
]
];
عرض الأحداث والمستمعين
استخدم الأمر php webman event:list
لعرض جميع الأحداث والمستمعين المحددين في المشروع
نطاق الدعم
بالإضافة إلى المكونات الأساسية للمشروع المكونات الأساسية ومكونات التطبيق تدعم أيضًا تكوين event.php.
ملف تكوين المكونات الأساسية config/plugin/بائع المكون/اسم المكون/event.php
ملف تكوين مكونات التطبيق plugin/اسم المكون/config/event.php
ملاحظات
معالجة أحداث event ليست غير تزامنية، event لا تناسب معالجة الأعمال البطيئة، يجب معالجة الأعمال البطيئة باستخدام صف الرسائل، مثل webman/redis-queue