2012-07-10 16 views
7

के साथ आलसी लोडिंग निर्भरताएं वर्तमान में मुझे एक सेवा के साथ एक सिम्फनी 2 डी कंटेनर उदाहरण तैयार है और इसकी सभी निर्भरताएं हैं। आइए उदाहरण के लिए मेरे पास एक कार श्रेणी है और इसमें इंजन और लाइट्स निर्भरता के रूप में हैं।सिम्फनी डी

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

क्या सिम्फनी डी में इसे प्राप्त करने का कोई तरीका है? इस प्रकार जब आवश्यक हो तो केवल लाइट्स ऑब्जेक्ट का एक उदाहरण बनाते हैं? मेरा अनुमान है कि यह कुछ प्रकार का प्रॉक्सी कार्यान्वयन होगा जैसे सिद्धांत है लेकिन जहां तक ​​मैंने देखा है कि यह सिम्फनी डी में मौजूद नहीं है।

उत्तर

2

dedendencies कि आपके services.yml के माध्यम से निर्माता के माध्यम से अनिवार्य हैं सम्मिलित करें, स्वचालित रूप से।
यदि आपके पास वैकल्पिक नियंत्रक हैं तो उन्हें अपने नियंत्रक में एक सेटटर के माध्यम से इंजेक्ट करें जब आपको उनकी आवश्यकता हो।

$this->container->get('cars')->setLights(new \Namespace\Lights()); 

बेशक अपने कारें वर्ग है, इसलिए की तरह डिजाइन किया जाना चाहिए और आप इंजेक्शन खुद को निर्देशित करने के लिए अपने नियंत्रक में है, या जहाँ भी जरूरत कोड।

1

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

शायद आपको फैक्टरी पैटर्न का उपयोग करना चाहिए। एक सेवा के रूप में CarFactory पंजीकृत करें, और उसके बाद Car उदाहरण प्राप्त करते समय, आप निर्दिष्ट कर सकते हैं कि इसमें Light निर्भरता शामिल होनी चाहिए।

क्या मैं पूछ सकता हूं कि आप इसे क्यों प्राप्त करना चाहते हैं? एक आसान समाधान हो सकता है।

+0

ठीक है मेरे मामले में मैं डीआई घटक स्टैंड-अलोन को एक पुराने जेडएफ प्रोजेक्ट में कार्यान्वित कर रहा हूं। मेरे पास कई सेवा वर्ग (AdminService, UserService, ...) हैं जिनके पास डीबीएएल, एसीएल, इत्यादि जैसी निर्भरताएं हैं ... सेवा वर्ग के लिए यह सही आवश्यकता है कि वे सही तरीके से कार्य करें। दूसरी ओर ऐसे फॉर्म और मॉडल जैसे उदाहरण हैं जिनका उपयोग केवल कुछ सेवा क्लास के तरीकों में किया जाता है। ये "सशर्त" निर्भरताएं हैं। मैं सोच रहा हूं कि यह भी बहुत असंभव है जब तक कि सिम्फनी डी में प्रॉक्सी सिस्टम नहीं है जैसे सिद्धांतों के लिए सिद्धांत का उपयोग करता है। – ChrisR

0

यह एक सुंदर कामकाज नहीं है, लेकिन आप पूरे डीआईसी इंजेक्शन करने का प्रयास कर सकते हैं, फिर जब आवश्यक हो तो लाइट और इंजन सेवाएं प्राप्त कर सकते हैं।

मैं कुछ के बारे में Car कक्षा में इस विधि की तरह सोच रहा था:

protected function getLightService() 
{ 
    if (!$this->light) { //so we reuse the first instance 
     $this->light = $this->dic->get("car.light"); 
    } 

    return $this->light; 
} 
+0

वर्तमान में मैं डी कंटेनर इंजेक्शन नहीं दे रहा हूं लेकिन इसे ZF FrontController से संदर्भित कर रहा हूं: 'Zend_Controller_Front :: getInstance() -> getParam (' bootstrap ') -> getDic() '। ऐसा कोई कारण नहीं है? – ChrisR

+0

मुझे ज़ेडएफ के साथ कोई अनुभव नहीं है, इसलिए मैं इसका उत्तर नहीं दे सकता। अगर यह आपके लिए अच्छा काम करता है, तो मुझे लगता है कि यह ठीक है। – Maerlyn

2

प्रश्न पहले ही उत्तर दिया गया है, लेकिन इस कार्यक्षमता की आवश्यकता वाले लोगों के लिए, आलसी सेवाएं सिम्फनी 2.3 में लागू की गई हैं।

आपको ProxyManager bridge इंस्टॉल करने की आवश्यकता है।

आप आधिकारिक दस्तावेज here पा सकते हैं।