PHP में डिपेंडेंसी इंजेक्शन: शुरुआती लोगों के लिए
\n\nकल्पना करें कि आप एक कंप्यूटर असेंबल कर रहे हैं। आप प्रोसेसर को मदरबोर्ड में हमेशा के लिए सोल्डर नहीं करते हैं — आप इसे एक विशेष स्लॉट में डालते हैं, ताकि ज़रूरत पड़ने पर इसे अधिक शक्तिशाली से बदल सकें। PHP में डिपेंडेंसी इंजेक्शन (DI) उसी सिद्धांत पर काम करता है: क्लास के अंदर निर्भरताएँ बनाने के बजाय, आप उन्हें बाहर से "इंजेक्ट" करते हैं।
\n\nइस लेख में, हम समझेंगे कि डिपेंडेंसी इंजेक्शन क्या है, इसकी आवश्यकता क्यों है, और इसे PHP में कैसे लागू करें। आप सीखेंगे कि अपने कोड को लचीला, परीक्षण योग्य और रखरखाव में आसान कैसे बनाएं।
\n\nसरल शब्दों में डिपेंडेंसी इंजेक्शन क्या है
\n\nडिपेंडेंसी इंजेक्शन एक डिज़ाइन पैटर्न है, जिसमें कोई ऑब्जेक्ट अपनी निर्भरताएँ (अन्य ऑब्जेक्ट, सेवाएँ) बाहर से प्राप्त करता है, न कि उन्हें स्वयं बनाता है। क्लास के अंदर new Database() लिखने के बजाय, आप कंस्ट्रक्टर या सेटर के माध्यम से एक तैयार डेटाबेस ऑब्जेक्ट पास करते हैं।
आइए उस समस्या को देखें जिसे DI हल करता है। UserService क्लास पर विचार करें, जो सीधे डेटाबेस कनेक्शन बनाता है:
<?php\nclass UserService {\n private $db;\n \n public function __construct() {\n // विशिष्ट कार्यान्वयन के साथ कठोर संबंध\n $this->db = new MySQLConnection('localhost', 'user', 'pass');\n }\n \n public function getUser($id) {\n return $this->db->query("SELECT * FROM users WHERE id = $id");\n }\n}\n?>\n\nइस दृष्टिकोण की समस्याएँ स्पष्ट हैं:
\n\n- \n
- कठोर संबंध (tight coupling) —
UserServiceक्लासMySQLConnectionसे बंधी हुई है। PostgreSQL पर स्विच करने के लिए, क्लास का कोड बदलना होगा। \n - परीक्षण में कठिनाई — आप यूनिट टेस्ट में डेटाबेस को mock-ऑब्जेक्ट से प्रतिस्थापित नहीं कर सकते। \n
- एकल जिम्मेदारी सिद्धांत का उल्लंघन — क्लास न केवल उपयोगकर्ताओं के साथ काम करता है, बल्कि DB कनेक्शन भी बनाता है। \n
अब इस क्लास को डिपेंडेंसी इंजेक्शन का उपयोग करके फिर से लिखते हैं:
\n\n<?php\ninterface DatabaseInterface {\n public function query($sql);\n}\n\nclass MySQLConnection implements DatabaseInterface {\n public function query($sql) {\n // MySQL के लिए कार्यान्वयन\n }\n}\n\nclass PostgreSQLConnection implements DatabaseInterface {\n public function query($sql) {\n // PostgreSQL के लिए कार्यान्वयन\n }\n}\n\nclass UserService {\n private $db;\n \n // कंस्ट्रक्टर के माध्यम से निर्भरता इंजेक्ट की जाती है\n public function __construct(DatabaseInterface $db) {\n $this->db = $db;\n }\n \n public function getUser($id) {\n return $this->db->query("SELECT * FROM users WHERE id = $id");\n }\n}\n\n// उपयोग\n$db = new MySQLConnection('localhost', 'user', 'pass');\n$userService = new UserService($db);\n?>\n\nअब UserService को यह नहीं पता कि वह किस डेटाबेस के साथ काम कर रहा है। वह बस DatabaseInterface इंटरफ़ेस का उपयोग करता है। यही डिपेंडेंसी इंजेक्शन का सार है।
निर्भरता इंजेक्शन के तीन मुख्य प्रकार
\n\nPHP में निर्भरता इंजेक्ट करने के तीन मुख्य तरीके हैं। आइए प्रत्येक पर विचार करें।
\n\n1. कंस्ट्रक्टर के माध्यम से इंजेक्शन (Constructor Injection)
\n\nयह सबसे सामान्य और अनुशंसित तरीका है। निर्भरताएँ कंस्ट्रक्टर के पैरामीटर के माध्यम से पास की जाती हैं और क्लास के प्राइवेट गुणों में संग्रहीत की जाती हैं।
\n\n<?php\nclass Logger {\n private $writer;\n \n public function __construct(LogWriterInterface $writer) {\n $this->writer = $writer;\n }\n \n public function log($message) {\n $this->writer->write($message);\n }\n}\n?>\n\nलाभ: निर्भरताएँ स्पष्ट रूप से दिखाई देती हैं, ऑब्जेक्ट हमेशा मान्य स्थिति में होता है (सभी निर्भरताएँ अनिवार्य हैं)।
\n\nनुकसान: य