के लिए Symfony वितरण निर्भरता इंजेक्शन पर काफी निर्भर करता। इसका मतलब है कि आम तौर पर, निर्भरता सीधे आपके ऑब्जेक्ट में कन्स्ट्रक्टर, सेटर्स या अन्य माध्यमों के माध्यम से इंजेक्शन दी जाती है (जैसे गुणों पर प्रतिबिंब)। आपकी एपीआई रैपर सेवा तब आपके आवेदन की अन्य वस्तुओं के लिए निर्भरता है।
कहा जा रहा है कि, इस सेवा को एक इकाई भंडार के निर्माता में इंजेक्ट करना मुश्किल होगा क्योंकि मुझे पहले से ही कुछ अन्य पैरामीटर की आवश्यकता है और मुझे लगता है कि जिस तरह से हम भंडार का अनुरोध करते हैं, उन्हें इंजेक्ट करना संभव नहीं होगा इकाई।
आप क्या कर सकता है एक और सेवा है जो काम आप इकाई भंडार में करने वाले थे, ऐसा करने का जिम्मेदार होगा तैयार करना है। इस तरह, आप इकाई प्रबंधक को इंजेक्ट करने में सक्षम होंगे, जिसका उपयोग इकाई भंडार को पुनर्प्राप्त करने के लिए किया जाएगा, आप कस्टम सेवा और आपके कॉन्फ़िगरेशन मान रखने वाली दूसरी सेवा (कॉन्फ़िगरेशन मानों को साझा करने के अन्य तरीके भी हैं)।
अपने प्रयोग के मामले में, मैं एक फेसबुक सहायक सेवा है कि लपेटता फेसबुक API कॉल का उपयोग करें। इस सेवा को तब इंजेक्शन दिया जाता है जहां मुझे इसकी आवश्यकता होती है। मेरी इकाई भंडार केवल डेटाबेस कॉल करने के लिए ज़िम्मेदार है, इसलिए इसे केवल उन तर्कों को प्राप्त होता है जो पूरी निर्भरता नहीं हैं। इस प्रकार, यह सहायक नहीं मिलेगा बल्कि अनुरोध करने के लिए केवल तर्कों की आवश्यकता होगी, उदाहरण के लिए, एक फेसबुक उपयोगकर्ता आईडी। मेरी राय में, ऐसा करने का यह तरीका है क्योंकि मुझे लगता है कि इकाई भंडार में ऐसी सहायक वस्तुओं पर निर्भरता नहीं होनी चाहिए।
यहाँ एक छोटा सा उदाहरण YAML विन्यास के रूप में उपयोग करते हुए:
# app/config/config.yml
services:
yourapp.configuration_container:
class: Application/AcmeBundle/Common/ConfigurationContainer
# You could inject configurations here
yourapp.api_wrapper:
class: Application/AcmeBundle/Service/ApiWrapperService
# Inject other arguments if needed and update constructor in consequence
yourapp.data_access:
class: Application/AcmeBundle/Data/Access/DatabaseAccessService
arguments:
entityManager: "@doctrine.orm.entity_manager"
apiWrapperService: "@yourapp.api_wrapper"
configuration: "@yourapp.configuration_container"
# Application/AcmeBundle/Common/ConfigurationContainer.php
public ConfigurationContainer
{
public function __construct()
{
// Initialize your configuration values or inject them in the constructor
}
}
# Application/AcmeBundle/Service/ApiWrapperService.php
public ApiWrapperService
{
public function __construct()
{
// Do some stuff
}
}
# Application/AcmeBundle/Data/Access/DatabaseAccessService.php
public DatabaseAccessService
{
public function __construct(EntityManager $entityManager, ApiWrapperService $apiWrapperService, ConfigurationContainer $configuration)
{
...
}
}
चिह्न (@) में config.yml फ़ाइल का मतलब है कि Symfony एक और सेवा इंजेक्षन चाहिए, आईडी संकेत पर बाद में परिभाषित होने पर, और एक साधारण स्ट्रिंग नहीं। कॉन्फ़िगरेशन मानों के लिए, जैसा कि मैंने पहले कहा था, पैरामीटर या बंडल एक्सटेंशन का उपयोग करने जैसे समान लक्ष्य प्राप्त करने के अन्य साधन हैं। एक बंडल एक्सटेंशन के साथ, आप कॉन्फ़िगरेशन मानों को सीधे config.yml में परिभाषित कर सकते हैं और आपका बंडल उन्हें पढ़ेगा।
निष्कर्ष में, आपको सेवाओं को इंजेक्शन देने का सामान्य विचार देना चाहिए। यहां विषय पर दस्तावेज़ीकरण की एक छोटी सूची है। लिंक के बहुत सारे वाईएएमएल परिभाषा के बजाय एक्सएमएल सेवा परिभाषा का उपयोग करते हैं लेकिन आप उन्हें आसानी से समझने में सक्षम होना चाहिए।
- Symfony Official DI
- Fabien Potencier's articles on DI
- Richard Miller's articles on DI
लें टिप्पणी (अन्य डि लेख के लिए अपने ब्लॉग में की जाँच करें) कि विन्यास मैं रहा हूं Symfony2 के Beta1 के लिए काम कर रहा है। मैंने अभी तक बीटा 2 में अपडेट नहीं किया है, इसलिए कुछ सामान काम नहीं कर रहे हैं क्योंकि वे बीटा 2 संस्करण में हैं।
मुझे आशा है कि यह आपकी समस्या के अंतिम समाधान को परिभाषित करने में आपकी सहायता करेगा। यदि आप स्पष्टीकरण या कुछ और चाहते हैं तो अन्य प्रश्न पूछने में संकोच न करें।
सादर, मैट
यह बड़ी मदद है, मुझे अपनी एपीआई सेवा को मेरी डेटाबेस सेवा में इंजेक्शन दिया गया है जो कि बहुत अच्छा है, मैं अभी भी थोड़ा अस्पष्ट हूं कि कॉन्फ़िगरेशन के साथ कैसे आगे बढ़ना है। अगर मैं समझाऊं कि मैं क्या करने की कोशिश कर रहा हूं तो सबसे अच्छा हो सकता है। मैं ऐसी साइट का निर्माण कर रहा हूं जो एकाधिक डोमेन पर काम करेगी, प्रत्येक साइट अपने हीम कॉन्फ़िगरेशन फ़ाइल के साथ पर्यावरण के रूप में मौजूद होगी। कॉन्फ़िगरेशन फ़ाइल में एक साइट आईडी होगी, जो मैं चाहता हूं वह getUsers() को कॉल करने में सक्षम होना है और इसके लिए कॉन्फ़िगरेशन से साइट आईडी प्राप्त करने के लिए और क्वेरी में "where site_id = x" स्वचालित रूप से जोड़ें। क्या यह संभव है या क्या मुझे आईडी को पैरामीटर के रूप में पास करना चाहिए? – pogo
बस सिम्फनी लेख को आपने महसूस किया कि यह कैसे किया जाए, यह जानने के लिए धन्यवाद, धन्यवाद। यह मुझे कुछ दिनों तक परेशान कर रहा है इसलिए समाधान करना बहुत अच्छा है। – pogo
खुशी है कि यह आपकी मदद करता है और आपके पास अब आपकी समस्या का समाधान है :) दरअसल, जो लेख मैंने लिंक किया है, उस पर पैरामीटर और सामान का उपयोग करने के तरीके के बारे में अधिक स्पष्ट है। आपके काम के साथ शुभकामनाएँ। – Matt