PHP में डिपेंडेंसी इंजेक्शन: कोड उदाहरणों के साथ पूर्ण गाइड

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

PHP में डिपेंडेंसी इंजेक्शन: व्यवहार में

\n\n

डिपेंडेंसी इंजेक्शन (DI) SOLID के प्रमुख सिद्धांतों में से एक है, जो लचीला, परीक्षण योग्य और रखरखाव योग्य कोड लिखने की अनुमति देता है। इस लेख में, हम वास्तविक उदाहरणों के साथ PHP में डिपेंडेंसी इंजेक्शन को लागू करने का तरीका समझेंगे, बिना अमूर्त सिद्धांतों के। आप सीखेंगे कि कक्षाओं के बीच कठोर संबंधों से कैसे छुटकारा पाएं और अपने कोड को बदलावों के लिए तैयार कैसे करें।

\n\n

डिपेंडेंसी इंजेक्शन क्या है और इसकी आवश्यकता क्यों है?

\n\n

कल्पना करें कि आपके पास एक UserController क्लास है जो डेटाबेस के साथ काम करता है। DI के बिना, आप संभवतः कंट्रोलर के अंदर ही कनेक्शन ऑब्जेक्ट बनाएंगे:

\n\n
class UserController {\n    private $db;\n    public function __construct() {\n        $this->db = new MySQLConnection('localhost', 'user', 'pass');\n    }\n}
\n\n

यह दृष्टिकोण एक कठोर संबंध (tight coupling) बनाता है। यदि आप PostgreSQL पर स्विच करना चाहते हैं या परीक्षण के लिए मॉक-ऑब्जेक्ट का उपयोग करना चाहते हैं, तो आपको कंट्रोलर का कोड बदलना होगा। डिपेंडेंसी इंजेक्शन इस समस्या को हल करता है: डिपेंडेंसी बाहर से पास की जाती हैं, क्लास के अंदर नहीं बनाई जातीं।

\n\n

DI के मुख्य लाभ:

\n
    \n
  • कोड की कपलिंग में कमी
  • \n
  • परीक्षण को सरल बनाना (डिपेंडेंसी को आसानी से बदला जा सकता है)
  • \n
  • कक्षाओं का पुन: उपयोग
  • \n
  • स्वच्छ आर्किटेक्चर और डिपेंडेंसी इनवर्जन सिद्धांत (DIP) का पालन
  • \n
\n\n

PHP में डिपेंडेंसी इंजेक्शन के तरीके

\n\n

डिपेंडेंसी इंजेक्शन के तीन मुख्य तरीके हैं। आइए प्रत्येक को उदाहरणों के साथ देखें।

\n\n

1. कंस्ट्रक्टर के माध्यम से इंजेक्शन

\n\n

सबसे सामान्य और अनुशंसित तरीका। डिपेंडेंसी कंस्ट्रक्टर के पैरामीटर के माध्यम से पास की जाती हैं और क्लास के गुणों में संग्रहीत की जाती हैं।

\n\n
<?php\ninterface DatabaseInterface {\n    public function query(string $sql): array;\n}\n\nclass MySQLDatabase implements DatabaseInterface {\n    public function query(string $sql): array {\n        // MySQL के साथ काम करने की वास्तविक लॉजिक\n        return ['id' => 1, 'name' => 'John'];\n    }\n}\n\nclass UserRepository {\n    private DatabaseInterface $db;\n    \n    public function __construct(DatabaseInterface $db) {\n        $this->db = $db;\n    }\n    \n    public function getUser(int $id): array {\n        return $this->db->query("SELECT * FROM users WHERE id = $id");\n    }\n}\n\n// उपयोग:\n$db = new MySQLDatabase();\n$repo = new UserRepository($db);\n$user = $repo->getUser(1);\n?>
\n\n

ध्यान दें: हम DatabaseInterface इंटरफ़ेस का उपयोग कर रहे हैं। यह कार्यान्वयन को आसानी से बदलने की अनुमति देता है — उदाहरण के लिए, परीक्षण स्टब पर।

\n\n

2. सेटर के माध्यम से इंजेक्शन

\n\n

इसका उपयोग तब किया जाता है जब ऑब्जेक्ट निर्माण के चरण में डिपेंडेंसी अनिवार्य नहीं होती या काम के दौरान बदल सकती है।

\n\n
<?php\nclass MailService {\n    private ?MailerInterface $mailer = null;\n    \n    public function setMailer(MailerInterface $mailer): void {\n        $this->mailer = $mailer;\n    }\n    \n    public function send(string $to, string $subject, string $body): void {\n        if ($this->mailer === null) {\n            throw new \\RuntimeException('Mailer not configured');\n        }\n        $this->mailer->send($to, $subject, $body);\n    }\n}\n\n// उपयोग:\n$mailService = new MailService();\n$mailService->setMailer(new SmtpMailer());\n$mailService->send('user@example.com', 'Hello', 'Body');\n?>
\n\n

इस दृष्टिकोण का नुकसान — आप गारंटी नहीं दे सकते कि send() विधि को कॉल करने से पहले डिपेंडेंसी सेट की जाएगी। इसलिए अनिवार्य डिपेंडेंसी के लिए कंस्ट्रक्टर बेहतर है।

\n\n

3. विधि के माध्यम से इंजेक्शन

\n\n

डिपेंडेंसी सीधे उस विधि में पास की जाती है जहाँ इसकी आवश्यकता है। दुर्लभ या संदर्भ-आधारित डिपेंडेंसी के लिए उपयोगी।

\n\n
<?php\nclass ReportGenerator {\n    public function generate(DataFetcherInterface $fetcher, string $reportType): array {\n        $data = $fetcher->                

ब्लॉग

पुस्तक अनुशंसाएँ