حاوية حقن التبعيات لـ PHP: ما هي ولماذا تحتاجها؟
\n\nحاوية حقن التبعيات (Dependency Injection Container) هي أداة قوية لإدارة التبعيات في تطبيقات PHP. تقوم بأتمتة عملية إنشاء الكائنات وحقن تبعياتها، مما يجعل الكود أكثر نمطية، قابلية للاختبار، وسهولة في الصيانة. في هذه المقالة، سنشرح بالتفصيل مفهوم DI، ونستعرض المكتبات الشائعة، ونقدم أمثلة على الاستخدام.
\n\nالمفاهيم الأساسية
\n\n- \n
- التبعية (Dependency) — أي كائن خارجي يحتاجه الفصل للعمل (مثل اتصال قاعدة بيانات، مسجل، خدمة بريد إلكتروني). \n
- حقن التبعيات (Dependency Injection) — نمط يتم فيه تمرير التبعيات إلى الكائن من الخارج، بدلاً من إنشائها داخله. \n
- الحاوية (Container) — مخزن مركزي يعرف كيفية إنشاء جميع التبعيات وإدارة دورة حياتها. \n
لماذا يجب استخدام حاوية DI؟
\n\nبدون حاوية DI، غالبًا ما يقوم المطورون بإنشاء التبعيات مباشرة داخل منشئات الفئات، مما يؤدي إلى ارتباط وثيق في الكود. هذا يعقد الاختبار، استبدال المكونات، وإعادة استخدام الكود. حاوية DI تحل هذه المشكلات:
\n\n- \n
- الحل التلقائي للتبعيات (autowiring). \n
- تكوين مركزي لجميع الخدمات. \n
- إدارة دورة حياة الكائنات (singleton, factory, prototype). \n
- تبسيط اختبار الوحدات. \n
حاويات DI الشائعة لـ PHP
\n\n1. PHP-DI (php-di.org)
\nواحدة من أشهر وأقوى الحاويات. تدعم الإكمال التلقائي، التعليقات التوضيحية، تكوين PHP، والتكامل مع الأطر الشائعة.
\n\n\n// مثال على استخدام PHP-DI\nuse DI\\ContainerBuilder;\n\nclass Mailer {\n public function send($to, $message) {\n echo "تم إرسال البريد إلى {$to}: {$message}";\n }\n}\n\nclass UserService {\n private $mailer;\n \n public function __construct(Mailer $mailer) {\n $this->mailer = $mailer;\n }\n \n public function registerUser($email) {\n // منطق التسجيل\n $this->mailer->send($email, 'مرحبًا بك!');\n }\n}\n\n$builder = new ContainerBuilder();\n$container = $builder->build();\n\n$userService = $container->get(UserService::class);\n$userService->registerUser('user@example.com');\n\n\n2. Symfony DependencyInjection (symfony.com/doc/current/components/dependency_injection.html)
\nمكون Symfony المستخدم في إطار العمل الذي يحمل نفس الاسم. يتميز بأداء عالٍ وقابلية توسع. يمكن أن يكون التكوين بصيغة YAML أو XML أو PHP.
\n\n\n// مثال على تكوين services.yml\nservices:\n App\\Service\\Mailer:\n class: App\\Service\\Mailer\n \n App\\Service\\UserService:\n class: App\\Service\\UserService\n arguments:\n - '@App\\Service\\Mailer'\n\n\n3. Laravel Service Container (laravel.com/docs/container)
\nالحاوية المدمجة في Laravel، المستخدمة افتراضيًا. تدعم الحل التلقائي، ربط الواجهات بالتطبيقات، والربط السياقي.
\n\n\n// مثال في Laravel\nuse App\\Services\\PaymentGateway;\nuse App\\Contracts\\PaymentInterface;\n\n// ربط الواجهة بالتطبيق\n$this->app->bind(PaymentInterface::class, PaymentGateway::class);\n\n// الحل التلقائي\nclass OrderController {\n public function __construct(\n private PaymentInterface $payment\n ) {}\n \n public function process() {\n $this->payment->charge(100);\n }\n}\n\n\nكيف تعمل حاوية DI: تحليل مفصل
\n\nلنلقِ نظرة على آلية العمل باستخدام PHP-DI كمثال. تستخدم الحاوية الانعكاس (Reflection) في PHP لتحليل منشئات الفئات وإنشاء التبعيات تلقائيًا. تبدو العملية كالتالي:
\n\n- \n
أيضاً في المكتبة
توصيات