2011-05-25 6 views
50

मैं ऐसी साइट का निर्माण कर रहा हूं जो किसी तृतीय पक्ष एपीआई पर काफी निर्भर करता है, इसलिए मैंने सोचा कि एपीआई रैपर को एक सेवा के रूप में पैकेज करना समझ में आता है, हालांकि मुझे ऐसे उदाहरण मिलना शुरू हो रहा है जहां पहुंच के लिए उपयोगी होगा एक नियंत्रक के बाहर जैसे कि एक इकाई भंडार में। इससे संबंधित यह भी नियंत्रक के बाहर कॉन्फ़िगरेशन मानों तक पहुंच प्राप्त करने में सक्षम होना उपयोगी होगा (जैसे कि एक इकाई भंडार में)।मैं Symfony2 के साथ नियंत्रक के बाहर एक सेवा का उपयोग कैसे कर सकता हूं?

किसी को भी मुझे बता सकते हैं यह संभव है और यदि नहीं वहाँ बात इस तरह का कर रही करने के लिए एक सुझाव दिया दृष्टिकोण है?

धन्यवाद किसी भी मदद

उत्तर

73

के लिए 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 में परिभाषित कर सकते हैं और आपका बंडल उन्हें पढ़ेगा।

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

  1. Symfony Official DI
  2. Fabien Potencier's articles on DI
  3. Richard Miller's articles on DI

लें टिप्पणी (अन्य डि लेख के लिए अपने ब्लॉग में की जाँच करें) कि विन्यास मैं रहा हूं Symfony2 के Beta1 के लिए काम कर रहा है। मैंने अभी तक बीटा 2 में अपडेट नहीं किया है, इसलिए कुछ सामान काम नहीं कर रहे हैं क्योंकि वे बीटा 2 संस्करण में हैं।

मुझे आशा है कि यह आपकी समस्या के अंतिम समाधान को परिभाषित करने में आपकी सहायता करेगा। यदि आप स्पष्टीकरण या कुछ और चाहते हैं तो अन्य प्रश्न पूछने में संकोच न करें।

सादर, मैट

+0

यह बड़ी मदद है, मुझे अपनी एपीआई सेवा को मेरी डेटाबेस सेवा में इंजेक्शन दिया गया है जो कि बहुत अच्छा है, मैं अभी भी थोड़ा अस्पष्ट हूं कि कॉन्फ़िगरेशन के साथ कैसे आगे बढ़ना है। अगर मैं समझाऊं कि मैं क्या करने की कोशिश कर रहा हूं तो सबसे अच्छा हो सकता है। मैं ऐसी साइट का निर्माण कर रहा हूं जो एकाधिक डोमेन पर काम करेगी, प्रत्येक साइट अपने हीम कॉन्फ़िगरेशन फ़ाइल के साथ पर्यावरण के रूप में मौजूद होगी। कॉन्फ़िगरेशन फ़ाइल में एक साइट आईडी होगी, जो मैं चाहता हूं वह getUsers() को कॉल करने में सक्षम होना है और इसके लिए कॉन्फ़िगरेशन से साइट आईडी प्राप्त करने के लिए और क्वेरी में "where site_id = x" स्वचालित रूप से जोड़ें। क्या यह संभव है या क्या मुझे आईडी को पैरामीटर के रूप में पास करना चाहिए? – pogo

+1

बस सिम्फनी लेख को आपने महसूस किया कि यह कैसे किया जाए, यह जानने के लिए धन्यवाद, धन्यवाद। यह मुझे कुछ दिनों तक परेशान कर रहा है इसलिए समाधान करना बहुत अच्छा है। – pogo

+0

खुशी है कि यह आपकी मदद करता है और आपके पास अब आपकी समस्या का समाधान है :) दरअसल, जो लेख मैंने लिंक किया है, उस पर पैरामीटर और सामान का उपयोग करने के तरीके के बारे में अधिक स्पष्ट है। आपके काम के साथ शुभकामनाएँ। – Matt

0

मैं एक Symfony सेवा (एक प्रबंधक की तरह) में इस तरह का व्यवहार लपेटो जाएगा। मैं इकाई भंडारों में किसी भी पैरामीटर या तर्क को इंजेक्ट नहीं करता, क्योंकि उन्हें मुख्य रूप से ऑब्जेक्ट मैनेजर प्रश्नों का उपयोग करके डेटा लाने के लिए उपयोग किया जाना चाहिए। मैं सेवाओं में तर्क डालूंगा और यदि सेवा के लिए डेटाबेस एक्सेस की आवश्यकता है तो यह डेटा लाने के लिए इकाई भंडार को कॉल करेगा।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^