Event Bus ونمط Observer في PHP: التنفيذ والأمثلة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

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
\n\n

Event Bus - تطور نمط Observer

\n\n

Event 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                    

توصيات