Event Bus ونمط Observer في PHP: من النظرية إلى التطبيق
\n\nفي التطوير الحديث باستخدام PHP، هناك حاجة متزايدة لإنشاء أنظمة ضعيفة الاقتران ومرنة وقابلة للتوسع. أداتان رئيسيتان لتحقيق هذا الهدف هما نمط Observer وتجريده الأكثر تقدماً - Event Bus (ناقل الأحداث). في هذه المقالة، سنشرح كيفية تنفيذ كلا النهجين في PHP، ونوضح متى نختار أي أداة.
\n\nما هو نمط Observer؟
\n\nنمط Observer (المراقب) هو نمط تصميم سلوكي يحدد علاقة من نوع "واحد إلى متعدد" بين الكائنات. عندما يغير كائن واحد (الناشر) حالته، يتم إخطار جميع الكائنات التابعة (المشتركون) تلقائياً بذلك.
\n\nتنفيذ بسيط لـ Observer في PHP:
\n\n<?php\ninterface Observer {\n public function update(string $event, $data): void;\n}\n\ninterface Observable {\n public function attach(Observer $observer): void;\n public function detach(Observer $observer): void;\n public function notify(string $event, $data = null): void;\n}\n\nclass UserManager implements Observable {\n private array $observers = [];\n\n public function attach(Observer $observer): void {\n $this->observers[] = $observer;\n }\n\n public function detach(Observer $observer): void {\n $this->observers = array_filter(\n $this->observers,\n fn($obs) => $obs !== $observer\n );\n }\n\n public function notify(string $event, $data = null): void {\n foreach ($this->observers as $observer) {\n $observer->update($event, $data);\n }\n }\n\n public function registerUser(string $name): void {\n // منطق التسجيل\n echo "المستخدم $name مسجل.\\n";\n $this->notify('user.registered', ['name' => $name]);\n }\n}\n\nclass EmailNotifier implements Observer {\n public function update(string $event, $data): void {\n if ($event === 'user.registered') {\n echo "إرسال بريد إلكتروني ترحيبي إلى {$data['name']}.\\n";\n }\n }\n}\n\nclass Logger implements Observer {\n public function update(string $event, $data): void {\n echo "تسجيل الحدث: $event\\n";\n }\n}\n\n// الاستخدام\n$userManager = new UserManager();\n$userManager->attach(new EmailNotifier());\n$userManager->attach(new Logger());\n\n$userManager->registerUser('إيفان');\n?>\n\nعيوب Observer التقليدي
\n\n- \n
- الارتباط الصارم - يجب أن يعرف المشتركون عن الناشر. \n
- عدم المرونة - صعوبة إدارة العديد من الأحداث غير المتجانسة. \n
- مشاكل في الاختبار - كل ناشر يحتوي على قائمة من المراقبين. \n
Event Bus - تطور نمط Observer
\n\nEvent Bus (ناقل الأحداث) هو وسيط مركزي بين ناشري الأحداث والمشتركين فيها. بدلاً من أن يدير كل كائن ناشر قائمة المراقبين الخاصة به، تمر جميع الاشتراكات والإخطارات عبر ناقل واحد.
\n\nتنفيذ Event Bus في PHP
\n\n<?php\nclass EventBus {\n private array $listeners = [];\n\n public function subscribe(string $event, callable $handler): void {\n $this->listeners[$event][] = $handler;\n }\n\n public function unsubscribe(string $event, callable $handler): void {\n if (!isset($this->listeners[$event])) {\n return;\n }\n $this->listeners[$event] = array_filter(\n $this->listeners[$event],\n fn($h) => $h !== $handler\n );\n }\n\n public function dispatch(string $event, $payload = null): void {\n if (!isset($this->listeners[$event])) {\n return;\n }\n foreach ($this->listeners[$event] as $handler) {\n call_user_func