Symfony कॉम्पोनेन्ट के साथ PHP में डिपेंडेंसी इंजेक्शन के उदाहरण
() translation by (you can also view the original English article)
इस आर्टिकल में, हम Symfony डिपेंडेंसी इंजेक्शन कॉम्पोनेन्ट का उपयोग करने के कुछ उदाहरण देखेंगे। आप डिपेंडेंसी इंजेक्शन की बेसिक बातें सीखेंगे, जो क्लीनर और अधिक मॉड्यूलर कोड की अनुमति देता है, और आप देखेंगे कि इसे अपने PHP एप्लिकेशन में Symfony कॉम्पोनेन्ट के साथ कैसे उपयोग किया जाए।
Symfony डिपेंडेंसी इंजेक्शन कॉम्पोनेन्ट क्या है?
Symfony डिपेंडेंसी इंजेक्शन कॉम्पोनेन्ट आपके PHP ऍप्लिकेशन्स में ऑब्जेक्ट्स को तुरंत चालू करने और डिपेंडेंसी मैनेजर को संभालने का एक स्टैण्डर्ड तरीका प्रदान करता है। डिपेंडेंसी इंजेक्शन कॉम्पोनेन्ट का दिल एक कंटेनर है जिसमें एप्लीकेशन में सभी उपलब्ध सर्विसेज होती हैं।
आपके एप्लीकेशन के बूटस्ट्रैपिंग स्टेप के दौरान, आपको कंटेनर में अपने एप्लीकेशन में सभी सर्विसेज को रजिस्टर करना होगा। बाद के स्टेप में, कंटेनर आवश्यकतानुसार सर्विसेज को बनाने के लिए ज़िम्मेदार है। सबसे महत्वपूर्ण बात यह है कि कंटेनर सर्विसेज की डेपेंडेन्सीज़ को बनाने और इंजेक्शन देने के लिए भी जिम्मेदार है।
इस दृष्टिकोण का लाभ यह है कि आपको ऑब्जेक्ट्स को बनाने की प्रक्रिया को कड़ी मेहनत करने की आवश्यकता नहीं है क्योंकि डिपेंडेंसी का पता लगाया जाएगा और स्वचालित रूप से इंजेक्शन दिया जाएगा। यह आपके एप्लीकेशन के कुछ हिस्सों के बीच एक लूस कपलिंग बनाता है।
इस आर्टिकल में, हम पता लगाएंगे कि आप डिपेंडेंसी इंजेक्शन कॉम्पोनेन्ट की शक्ति को कैसे मुक्त कर सकते हैं। हमेशा की तरह, हम इंस्टालेशन और कॉन्फ़िगरेशन इंस्ट्रक्शन के साथ शुरू करेंगे, और हम महत्वपूर्ण कॉन्सेप्ट्स को प्रदर्शित करने के लिए कुछ वास्तविक-दुनिया के उदाहरणों को लागू करेंगे।
इंस्टॉलशं और कॉन्फ़िगरेशन
इस सेक्शन में, हम आगे बढ़ेंगे और डिपेंडेंसी इंजेक्शन कॉम्पोनेन्ट इनस्टॉल करेंगे। मुझे लगता है कि आपने पहले से ही अपने सिस्टम में Composer इनस्टॉल कर लिया है क्योंकि हमें इसकी Packagist पर उपलब्ध डिपेंडेंसी इंजेक्शन कॉम्पोनेन्ट इनस्टॉल करने के लिए आवश्यकता होगी।
तो आगे बढ़ें और निम्न कमांड का उपयोग करके डिपेंडेंसी इंजेक्शन कॉम्पोनेन्ट इनस्टॉल करें।
1 |
$composer require symfony/dependency-injection
|
उसने composer.json फ़ाइल बनाई होनी चाहिए, जो इस तरह दिखना चाहिए:
1 |
{
|
2 |
"require": { |
3 |
"symfony/dependency-injection": "^4.1", |
4 |
}
|
5 |
}
|
हम कुछ अन्य कॉम्पोनेन्ट भी इंस्टॉल करेंगे जो हमारे उदाहरणों में उपयोगी होंगे।
यदि आप PHP कोड में इसे परिभाषित करने के बजाय YAML फ़ाइल से सर्विसेज को लोड करना चाहते हैं, तो यह Yaml कॉम्पोनेन्ट है जो बचाव के लिए आता है क्योंकि यह आपको YAML स्ट्रिंग को PHP-कम्पेटिबल डेटा टाइप्स और इसके विपरीत रूपांतरित करने में मदद करता है।
1 |
$composer require symfony/yaml
|
अंत में, हम कॉन्फ़िगरेशन कॉम्पोनेन्ट इनस्टॉल करेंगे जो कई यूटिलिटी क्लासेज को कॉन्फ़िगरेशन वैल्यूज को प्रारंभ करने और उनसे निपटने के लिए प्रदान करता है जो YAML, INI और XML जैसी विभिन्न प्रकार की फाइलों में परिभाषित हैं। हमारे मामले में, हम इसका उपयोग YAML फ़ाइल से सर्विसेज को लोड करने के लिए करेंगे।
1 |
$composer require symfony/config
|
आइए निम्न की तरह दिखने के लिए composer.json फ़ाइल को संशोधित करें।
1 |
{
|
2 |
"require": { |
3 |
"symfony/dependency-injection": "^4.1", |
4 |
"symfony/config": "^4.1", |
5 |
"symfony/yaml": "^4.1" |
6 |
},
|
7 |
"autoload": { |
8 |
"psr-4": { |
9 |
"Services\\": "src" |
10 |
},
|
11 |
"classmap": ["src"] |
12 |
}
|
13 |
}
|
चूंकि हमने एक नई क्लासमैप एंट्री जोड़ दी है, चलिए आगे बढ़ें और निम्न कमांड चलाकर कंपोजर ऑटोलोडर अपडेट करें।
1 |
$composer dump -o |
अब, आप src डायरेक्टरी के अंडर में क्लासेज को autoload करने के लिए Services
नेमस्पेस का उपयोग कर सकते हैं।
तो यह इंस्टालेशन का हिस्सा है, लेकिन आप इसका उपयोग कैसे कर रहे हैं? वास्तव में, यह आपके एप्लीकेशन में Composer द्वारा बनाई गई autoload.php फ़ाइल को शामिल करने का विषय है, जैसा कि निम्न स्निपेट में दिखाया गया है।
1 |
<?php
|
2 |
require_once './vendor/autoload.php'; |
3 |
|
4 |
// application code
|
5 |
?>
|
कंटेनर के साथ कैसे काम करें
इस सेक्शन में, हम यह दिखाने के लिए एक उदाहरण के माध्यम से देखेंगे कि आप कंटेनर में सर्विसेज को कैसे इंजेक्ट कर सकते हैं। एक कंटेनर को सेंट्रल रिपॉजिटरी के रूप में कार्य करना चाहिए जो आपके एप्लीकेशन में सभी सर्विसेज रखता है। बाद में, हम आवश्यकतानुसार सर्विसेज को लाने के लिए कंटेनर का उपयोग कर सकते थे।
आरंभ करने के लिए, आगे बढ़ें और निम्नलिखित कंटेंट के साथ src/DemoService.php पर एक सुंदर बेसिक सर्विस परिभाषित करें।
1 |
<?php
|
2 |
// src/DemoService.php
|
3 |
namespace Services; |
4 |
|
5 |
class DemoService |
6 |
{
|
7 |
public function helloWorld() |
8 |
{
|
9 |
return "Hello World!\n"; |
10 |
}
|
11 |
}
|
यह एक बहुत ही सरल सर्विस है जो इस पल के लिए helloWorld
मेथड इम्प्लीमेंट करती है।
इसके बाद, आगे बढ़ें और अपने एप्लीकेशन की जड़ में निम्न कंटेंट के साथ basic_container.php फ़ाइल बनाएं।
1 |
<?php
|
2 |
// basic_container.php
|
3 |
require_once './vendor/autoload.php'; |
4 |
use Symfony\Component\DependencyInjection\ContainerBuilder; |
5 |
|
6 |
// init service container
|
7 |
$containerBuilder = new ContainerBuilder(); |
8 |
|
9 |
// add service into the service container
|
10 |
$containerBuilder->register('demo.service', '\Services\DemoService'); |
11 |
|
12 |
// fetch service from the service container
|
13 |
$demoService = $containerBuilder->get('demo.service'); |
14 |
echo $demoService->helloWorld(); |
आरंभ करने के लिए, हमने ContainerBuilder
ऑब्जेक्ट को new ContainerBuilder()
कन्स्ट्रक्टर के साथ शुरू किया। इसके बाद, हमने कंटेनर में हमारी कस्टम सर्विस \Services\DemoService
इंजेक्ट करने के लिए ContainerBuilder
ऑब्जेक्ट की register
मेथड का उपयोग किया। demo.service
हमारी सर्विस के लिए अलियास के रूप में कार्य करता है।
आखिरकार, हमने ContainerBuilder
ऑब्जेक्ट के कंटेनर से हमारी सर्विस लाने के लिए get
मेथड का उपयोग किया और helloWorld
मेथड को कॉल करने के लिए इसका इस्तेमाल किया।
तो यह एक कंटेनर के साथ काम करने का एक बेसिक डेमोंस्ट्रेशन था। अगले सेक्शन में, हम यह उदाहरण एक्सटेंड करेंगे कि कंटेनर का उपयोग करके क्लास डिपेंडेंसी का समाधान कैसे किया जाता है।
एक असली दुनिया का उदाहरण
इस सेक्शन में, हम एक उदाहरण तैयार करेंगे जो दर्शाता है कि डिपेंडेंसी इंजेक्शन कॉम्पोनेन्ट का उपयोग करके क्लास डिपेंडेंसी का समाधान कैसे किया जाता है।
इसे प्रदर्शित करने के लिए, हम एक नई सर्विस DependentService
प्रदान करेंगे जिसके लिए डिपेंडेंसी के रूप में पिछले सेक्शन में बनाए गए DemoService
सर्विस की आवश्यकता होती है। इस प्रकार, हम देखेंगे कि DependentServcie
सर्विस प्रारम्भ होने पर DemoService
सर्विस को डिपेंडेंसी के रूप में स्वचालित रूप से इंजेक्शन दिया जाता है।
आगे बढ़ें और DependentService
सर्विस को परिभाषित करने के लिए निम्नलिखित कंटेंट के साथ src/DependentService.php फ़ाइल बनाएं।
1 |
<?php
|
2 |
// src/DependentService.php
|
3 |
namespace Services; |
4 |
|
5 |
class DependentService |
6 |
{
|
7 |
private $demo_service; |
8 |
|
9 |
public function __construct(\Services\DemoService $demoService) |
10 |
{
|
11 |
$this->demo_service = $demoService; |
12 |
}
|
13 |
|
14 |
public function helloWorld() |
15 |
{
|
16 |
return $this->demo_service->helloWorld(); |
17 |
}
|
18 |
}
|
जैसा कि आप देख सकते हैं, DependentService
सर्विस को तुरंत चालू करने के लिए \Services\DemoService
सर्विस की आवश्यकता है।
इसके बाद, आगे बढ़ें और निम्न कंटेंट के साथ di_container.php फ़ाइल बनाएं।
1 |
<?php
|
2 |
// di_container.php
|
3 |
require_once './vendor/autoload.php'; |
4 |
use Symfony\Component\DependencyInjection\ContainerBuilder; |
5 |
use Symfony\Component\DependencyInjection\Reference; |
6 |
|
7 |
// init service container
|
8 |
$containerBuilder = new ContainerBuilder(); |
9 |
|
10 |
// add demo service into the service container
|
11 |
$containerBuilder->register('demo.service', '\Services\DemoService'); |
12 |
|
13 |
// add dependent service into the service container
|
14 |
$containerBuilder->register('dependent.service', '\Services\DependentService') |
15 |
->addArgument(new Reference('demo.service')); |
16 |
|
17 |
// fetch service from the service container
|
18 |
$dependentService = $containerBuilder->get('dependent.service'); |
19 |
echo $dependentService->helloWorld(); |
हम कंटेनर में हमारी कस्टम सर्विस \Services\DependentService
इंजेक्ट करने के लिए एक ही register
मेथड का उपयोग कर रहे हैं।
इसके अलावा, हमने DependentService
सर्विस की डिपेंडेंसी के बारे में कंटेनर को सूचित करने के लिए addArgument
मेथड भी उपयोग किया है। हमने कंटेनर को सूचित करने के लिए Reference
क्लास का उपयोग किया है कि dependent.service
सर्विस प्रारंभ होने पर demo.service
सर्विस को इंजेक्ट करने की आवश्यकता है। इस तरह, एक डिपेंडेंसी ऑटोमेटिकली आवश्यकतानुसार इंजेक्ट की जाती है!
अंत में, हमने ContainerBuilder
ऑब्जेक्ट से dependent.service
सर्विस लाने के लिए ContainerBuilder
ऑब्जेक्ट के get
मेथड का उपयोग किया है और इसे helloWorld
मेथड को कॉल करने के लिए उपयोग किया है।
इस तरह, DependencyInjection कॉम्पोनेन्ट ऑब्जेक्ट्स को तुरंत चालू करने और आपके एप्लीकेशन में डिपेंडेंसी को इंजेक्ट करने का एक स्टैण्डर्ड तरीका प्रदान करता है।
YAML फ़ाइल का उपयोग करके सर्विसेज को डायनामिक तरीके से लोड कैसे करें
इस अंतिम सेक्शन में, हम एक्स्प्लोर करेंगे कि आप YAML फ़ाइल से डायनामिक तरीके से सर्विसेज को कैसे लोड कर सकते हैं। असल में, हम पिछले सेक्शन में चर्चा किए गए उदाहरण को अपडेट करेंगे।
DependencyInjection कॉम्पोनेन्ट के अतिरिक्त, हमें YAML उदाहरण-कॉन्फ़िगर और Yaml को लागू करने के लिए दो और Symfony कॉम्पोनेन्ट भी चाहिए। याद रखें कि हमने इन दो कॉम्पोनेन्ट को पहले से ही डिपेंडेंसी इंजेक्शन कॉम्पोनेन्ट के साथ इंस्टालेशन और कॉन्फ़िगरेशन सेक्शन में इनस्टॉल कर लिया है। तो हम चलने के लिए तैयार हैं!
आगे बढ़ें और अपने एप्लीकेशन की रुट में निम्नलिखित कंटेंट के साथ services.yaml फ़ाइल बनाएं।
1 |
services: |
2 |
demo.service: |
3 |
class: \Services\DemoService |
4 |
dependent.service: |
5 |
class: \Services\DependentService |
6 |
arguments: ["@demo.service"] |
जैसा कि आप देख सकते हैं, YAML सिंटैक्स का उपयोग करके सर्विसेज को परिभाषित करना बहुत सरल है। अपनी सर्विस की डिपेंडेंसी को परिभाषित करने के लिए, आपको argument
key का उपयोग करने की आवश्यकता होगी।
इसके बाद, आगे बढ़ें और निम्न कंटेंट के साथ di_yaml_container.php फ़ाइल बनाएं।
1 |
<?php
|
2 |
// di_yaml_container.php
|
3 |
require_once './vendor/autoload.php'; |
4 |
use Symfony\Component\DependencyInjection\ContainerBuilder; |
5 |
use Symfony\Component\Config\FileLocator; |
6 |
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; |
7 |
|
8 |
// init service container
|
9 |
$containerBuilder = new ContainerBuilder(); |
10 |
|
11 |
// init yaml file loader
|
12 |
$loader = new YamlFileLoader($containerBuilder, new FileLocator(__DIR__)); |
13 |
|
14 |
// load services from the yaml file
|
15 |
$loader->load('services.yaml'); |
16 |
|
17 |
// fetch service from the service container
|
18 |
$serviceOne = $containerBuilder->get('dependent.service'); |
19 |
echo $serviceOne->helloWorld(); |
सब कुछ काफी एक जैसा है सिवाय इसके कि हम सर्विसेज से PHP कोड में परिभाषित करने के बजाय services.yaml को लोड कर रहे हैं। यह एप्लिकेशन डिपेंडेंसी को डायनामिक तरीके से परिभाषित करने की अनुमति देता है।
निष्कर्ष
Symfony DependencyInjection कॉम्पोनेन्ट ने इस ट्यूटोरियल में सेण्टर स्टेज लिया। हमने देखा कि DependencyInjection को कैसे इनस्टॉल और कॉन्फ़िगर करना है, साथ ही साथ कुछ असली दुनिया के उदाहरणों का उपयोग कैसे किया जा सकता है।
मैं Symfony फ्रेमवर्क के decoupled कॉम्पोनेन्ट के बारे में वास्तव में फेसिनेट और एक्साइटेड हूँ कि आप बस अपने एप्लीकेशन के लिए पिक कर सकते हैं और चुन सकते हैं। उन्हें अपने कोड में प्लग करें और वे बस काम करते हैं! सब कुछ में, मैं केवल हमारे PHP कम्युनिटी के लिए इस नए फ्रेमवर्क के दृष्टिकोण के लाभ देख सकता हूं!
नीचे दिए गए फ़ीड का उपयोग करके अपने विचारों और सुझावों को साझा करें। मुझे आपके साथ आगे चर्चा करना अच्छा लगेगा!