حاوية حقن التبعيات لـ PHP: دليل شامل لحقن التبعيات

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

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

ابدأ الدورة

حاوية حقن التبعيات لـ PHP: ما هي ولماذا تحتاجها؟

\n\n

حاوية حقن التبعيات (Dependency Injection Container) هي أداة قوية لإدارة التبعيات في تطبيقات PHP. تقوم بأتمتة عملية إنشاء الكائنات وحقن تبعياتها، مما يجعل الكود أكثر نمطية، قابلية للاختبار، وسهولة في الصيانة. في هذه المقالة، سنشرح بالتفصيل مفهوم DI، ونستعرض المكتبات الشائعة، ونقدم أمثلة على الاستخدام.

\n\n

المفاهيم الأساسية

\n\n
    \n
  • التبعية (Dependency) — أي كائن خارجي يحتاجه الفصل للعمل (مثل اتصال قاعدة بيانات، مسجل، خدمة بريد إلكتروني).
  • \n
  • حقن التبعيات (Dependency Injection) — نمط يتم فيه تمرير التبعيات إلى الكائن من الخارج، بدلاً من إنشائها داخله.
  • \n
  • الحاوية (Container) — مخزن مركزي يعرف كيفية إنشاء جميع التبعيات وإدارة دورة حياتها.
  • \n
\n\n

لماذا يجب استخدام حاوية DI؟

\n\n

بدون حاوية DI، غالبًا ما يقوم المطورون بإنشاء التبعيات مباشرة داخل منشئات الفئات، مما يؤدي إلى ارتباط وثيق في الكود. هذا يعقد الاختبار، استبدال المكونات، وإعادة استخدام الكود. حاوية DI تحل هذه المشكلات:

\n\n
    \n
  • الحل التلقائي للتبعيات (autowiring).
  • \n
  • تكوين مركزي لجميع الخدمات.
  • \n
  • إدارة دورة حياة الكائنات (singleton, factory, prototype).
  • \n
  • تبسيط اختبار الوحدات.
  • \n
\n\n

حاويات DI الشائعة لـ PHP

\n\n

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

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

3. 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

توصيات