PHP में निर्भरता इंजेक्शन क्या है, और इसका उपयोग कैसे करें

सॉफ्टवेयर विकास की एक लोकप्रिय और अच्छी तरह से ज्ञात कार्यप्रणाली को निर्भरता इंजेक्शन कहा जाता है, जो प्रवाह को सुविधाजनक बनाने में मदद करता है ताकि यह सुनिश्चित हो सके कि आपके सॉफ़्टवेयर में हमेशा उस उपकरण तक पहुंच हो जो उसे चाहिए। कई इस पद्धति को काफी जटिल बनाने की कोशिश करते हैं, लेकिन यह वास्तव में नहीं है।

चलो निर्भर करता है कि निर्भरता इंजेक्शन क्या है, यह कैसे काम करता है, और यह आपके सॉफ़्टवेयर को कैसे लाभान्वित करेगा।

निर्भरता इंजेक्शन क्या है?

निर्भरता इंजेक्शन के लिए एक महान सादृश्य एक टूलकिट के साथ एक कार्यकर्ता है जो सॉफ्टवेयर के साथ यात्रा करता है क्योंकि इसे संसाधित किया जा रहा है, जिससे सब कुछ सुचारू रूप से सुनिश्चित होता है। टूलकिट में सभी प्रकार की चीजें शामिल हो सकती हैं, जिनमें चर, सरणियां, ऑब्जेक्ट , क्लोजर, और हाथ में कार्य को पूरा करने के लिए आवश्यक कुछ भी शामिल हैं।

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

आप अपने टूलकिट को अपनी ज़रूरत के अनुसार भर सकते हैं, फिर कक्षाओं के भीतर और सॉफ़्टवेयर के तरीकों में आपके द्वारा आवश्यक उपकरण निर्दिष्ट होते हैं, और वे स्वचालित रूप से आपके लिए होंगे।

शीर्ष कंटेनर स्थापित करें

कई अलग-अलग कार्यान्वयन हैं, लेकिन सभी मूल रूप से एक ही काम करते हैं, और हम एपेक्स कंटेनर का उपयोग करेंगे क्योंकि यह सरल और सीधा आगे है। यह मान लिया गया है कि आपके पास पहले से ही PHP स्थापित है, और आप यह जांच सकते हैं कि क्या कमांडर कमांड के साथ स्थापित है या नहीं:

 composer --version

यदि आपको "कमांड नहीं मिली" त्रुटि मिलती है, तो आप निम्नलिखित कमांड के साथ कम्पोज़र स्थापित कर सकते हैं:

 sudo curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer

अब एक रिक्त निर्देशिका बनाएँ, और निर्देशिका के भीतर निम्नलिखित कमांड चलाएँ:

 composer require apex/container
composer require twig/twig

यह एपेक्स कंटेनर और लोकप्रिय ट्विग टेम्पलेट इंजन दोनों को डाउनलोड करेगा जो नीचे दिए गए उदाहरणों में उपयोग किया जाएगा। दोनों / विक्रेता / उप-निर्देशिका के भीतर पाए जा सकते हैं।

अपने उपकरण इंजेक्ट करें

चलो निम्नलिखित कोड के साथ कार नामक एक त्वरित वर्ग बनाते हैं:

 
<?php
use TwigLoaderArrayLoader;
class Car
{
public function __construct(
public string $model,
public string $color,
public ArrayLoader $db
) {
echo "I'm a $color $model and have a " . $db::class . "
";
}
}

यह एक साधारण वर्ग है जिसमें दो गुण होते हैं, कार का रंग और रंग, और ट्विग से 'एरेरेलैडेर' वर्ग को लोड करता है। इसे car.php के रूप में सहेजें और उपयोग करने के लिए निर्भरता इंजेक्शन का जादू डालने के लिए तैयार करें। एक और रिक्त फ़ाइल खोलें और निम्नलिखित कोड जोड़ें:

 
<?php
use ApexContainerContainer;
// Load Composer packages, and the car.php file
require_once(__DIR__ . '/vendor/autoload.php');
require_once(__DIR__ . '/car.php');
// Create container, and add a couple tools
$cntr = new Container(use_attributes: true);
$cntr->set('model', 'Jaguar');
$cntr->set('color', 'silver');
// Create our car object
$car = $cntr->make('Car');
$car2 = $cntr->make('car', ['color' => 'red']);

इस कोड को टर्मिनल में सहेजें और चलाएं, और परिणाम इस प्रकार होंगे:

 I'm a silver Jaguar and have a TwigLoaderArrayLoader
I'm a red Jaguar and have a TwigLoaderArrayLoader

उपरोक्त कोड में, आपने कंटेनर (यानी टूलकिट) को तत्काल जोड़ा, और एक जोड़ी उपकरण, रंग और एक कार बनाया। सामान्य नई कार () के साथ कार ऑब्जेक्ट बनाने के बजाय ; , यह कंटेनर के मेक () विधि के माध्यम से बनाया गया था। यह आवश्यकताओं की जांच करने के लिए पहले कक्षा के माध्यम से गया, फिर हमने जो आइटम (यानी उपकरण) उपलब्ध थे, उन्हें देखा और वापस सौंपने से पहले उन्हें कक्षा में इंजेक्ट किया।

आप फ़ाइल के शीर्ष पर उपयोग घोषणा को ArrayLoader को नोटिस करेंगे, और निर्माणकर्ता में तीसरा तर्क ArrayLoader के लिए भी पूछता है। जब कंटेनर ने कक्षा की आवश्यकताओं को देखा, तो इन दोनों पहलुओं पर ध्यान दिया, स्वचालित रूप से ArrayLoader का एक उदाहरण बनाया और इसे कंस्ट्रक्टर में इंजेक्ट किया। इसे ऑटो-वायरिंग कहा जाता है।

विशेषता इंजेक्शन के साथ विस्तार

इसे एक कदम आगे बढ़ाते हुए, केवल कंस्ट्रक्टर में इंजेक्ट करने के बजाय, हम गुणों के माध्यम से सीधे गुणों में भी इंजेक्ट कर सकते हैं। कार फ़ाइल को संशोधित करें, और इसे इसमें बदलें:

 
<?php
use TwigLoaderArrayLoader;
use ApexContainerContainer;
class Car
{
#[Inject(Container::class)]
public Container $cntr;
public function __construct(
public string $model,
public string $color,
public ArrayLoader $db
) {
echo "I'm a $color $model and have a " . $db::class . "
";
}
function getCost()
{
echo "Class is " . $this->cntr::class . "
";
}
}

केवल संशोधनों के लिए एक नया उपयोग घोषणा जोड़ा गया था, कंटेनर वर्ग के लिए विशेषता के साथ संपत्ति को जोड़ा गया था, और हमने एक नया गेटकॉस्ट () फ़ंक्शन जोड़ा। आपके द्वारा पहले चलाए गए परीक्षण कोड के निचले भाग में, पंक्ति जोड़ें:

 $car->getCost();

अब कोड फिर से चलाएँ, और परिणाम होंगे:

 I'm a silver Jaguar and have a TwigLoaderArrayLoader
I'm a red Jaguar and have a TwigLoaderArrayLoader
Class is ApexContainerContainer

इस बार जब car.php क्लास को लोड किया गया था, तब कंटेनर ने इसके गुणों को भी देखा, कंटेनर क्लास के लिए कॉल करने वाले Inject विशेषता को देखा, और इसका एक उदाहरण इंजेक्ट किया। इस तरह से विशेषताओं के माध्यम से इंजेक्शन देना कभी-कभी पसंद किया जाता है क्योंकि यह चीजों को साफ और अधिक पठनीय रखने में मदद करता है।

अपने खुद के उपकरण प्राप्त करें

हमेशा वस्तुओं को इंजेक्ट करने के बजाय, यदि आप कंटेनर से किसी आइटम को स्वयं प्राप्त करना चाहते हैं तो क्या होगा? यह आसानी से कंटेनर के प्राप्त () विधि के साथ किया जा सकता है। Car.php फ़ाइल के भीतर, पहले जोड़े गए गोस्ट () फ़ंक्शन को इसके साथ संशोधित करें:

 
function getCost()
{
$price = $this->cntr->get('car_price');
echo "The price is $price
";
}

अब आपके द्वारा चलाए जा रहे परीक्षण कोड के भीतर, कहीं भी लाइन से पहले जो गेटकॉस्ट को बुलाता है ( जैसे ) एक पंक्ति जोड़ें:

 $cntr->set('car_price', 24995);

अब कोड चलाएं, और परिणाम होंगे:

 I'm a silver Jaguar and have a TwigLoaderArrayLoader
I'm a red Jaguar and have a TwigLoaderArrayLoader
Price is 24999

जरूरी नहीं कि आपको अपने आइटमों को इंजेक्ट करने की आवश्यकता है, और हमेशा आसानी से हड़प सकते हैं जो आपको ऊपर बताए अनुसार () विधि के साथ चाहिए।

डिपेंडेंसी इंजेक्शन के साथ आगे बढ़ना

अब आपके पास वास्तव में एक अच्छा अवलोकन है कि निर्भरता इंजेक्शन क्या है, और यह कैसे काम करता है। फिर, उपरोक्त कई कार्यान्वयनों में से एक है, लेकिन सभी कार्यान्वयन वहाँ () / सेट () / बनाने () विधियों के साथ उसी तरह काम करते हैं।

अभी भी निर्भरता इंजेक्शन के लिए और अधिक है, जैसे कि परिभाषा फ़ाइल और विधि इंजेक्शन। यदि रुचि है, तो एपेक्स कंटेनर मैनुअल या अन्य कार्यान्वयन देखें।