2012-05-21 21 views
13

मुझे समझ में नहीं आता कि यह "डी कंटेनर" कैसा है। आधिकारिक साइट पर दिखाए गए उदाहरण मुझे कुछ भी नहीं बताते हैं: http://pimple.sensiolabs.orgपंपल को समझना

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

ये सभी वर्ग पिंपल में उल्लिखित "सेवाओं" की तरह हैं, और प्रत्येक सेवा एक और सेवा कॉल करने में सक्षम होना चाहिए। अभी मैं एक मुख्य कक्षा में सेवाओं को तत्काल कर रहा हूं जिसका उपयोग मैं अन्य वर्गों में सेवाओं को साझा करने के लिए एक सिंगलटन की तरह करता हूं।

जो मैंने पढ़ा है, से पिंपल बिल्कुल इस तरह की चीज करता है, लेकिन मैं इसका उपयोग कैसे करूं? :

उत्तर

18

http://phpmaster.com/dependency-injection-with-pimple/ पर एक ट्यूटोरियल है जो कि डीआईसी के रूप में पिंपल का उपयोग कैसे करें।

एक और (लेकिन जरूरी नहीं अनुशंसित) दृष्टिकोण कंटेनर को उन सभी घटकों में इंजेक्ट करना है जिन्हें इसकी आवश्यकता है (उदाहरण के लिए आप इसे एक सेवा लोकेटर की तरह उपयोग करते हैं) और फिर आप दस्तावेज कहते हैं कि आपको ऑब्जेक्ट प्राप्त करने के लिए क्या करना चाहिए दाना:

class SomeClassThatNeedsSession 
{ 
    private $session; 
    public function __construct(Pimple $container) 
    { 
     $this->session = $container['session']; 
    } 
} 

दूसरे शब्दों में, तुम सिर्फ तुम क्या जरूरत है और Pimple will handle the lifetime of that object, e.g. whether it needs to be created or is reused लाने। ऑफसेट गेट ArrayAccess इंटरफ़ेस का हिस्सा है जो आपको एक ऐरे जैसे ऑब्जेक्ट तक पहुंचने की अनुमति देता है, इसलिए जब आप $container['foo'] करते हैं तो पिंपल यह जांच करेगा कि क्या इसके लिए कुछ बंद है या नहीं और इसके अनुसार सेवा को इकट्ठा करने के लिए इसे बंद कर दिया गया है।

पिंपल blog post about Lambdas and Closures का परिणाम था जिसे आप बेहतर ढंग से समझने के लिए पढ़ना चाहते हैं कि यह कैसे काम करता है।

+4

क्या यह कक्षा को पूरे कंटेनर देने के लिए अच्छा अभ्यास माना जाता है? क्या वह थोड़ा डेमेटर के कानून का उल्लंघन नहीं करता है जिससे आप अपनी नौकरी करने की आवश्यकता से अधिक कक्षा दे रहे हैं? – AgmLauncher

+2

@ एएमएमएलएचर डेमेटर का कानून LoD पर मूल पेपर के अनुसार वस्तुओं को बनाने के तरीकों पर लागू नहीं होता है। चूंकि एक सेवा लोकेटर प्रभावी ढंग से फैक्ट्री बनाने वाली फैक्ट्री है, इसलिए यह वास्तव में एलओडी का उल्लंघन नहीं कर रहा है। हालांकि, एक सेवा लोकेटर का उपयोग करने वाले सभी वर्गों में एसएल पर निर्भरता होगी, जिसके बाद पुन: उपयोग किया जाता है, इसलिए बेहतर है कि इसे एक जैसा इस्तेमाल न करें, लेकिन मेरे द्वारा दिए गए पहले लिंक में सुझाए गए उपयोग का पालन करें। – Gordon

+1

यदि आप कन्स्ट्रक्टर में पूरे पिंपल कंटेनर इंजेक्ट करते हैं तो हम कैसे बता सकते हैं कि क्लास SomeClassThatNeedsSession के लिए वास्तविक निर्भरता क्या हैं? परीक्षणों के लिए नकली करने के लिए मुझे कौन सी निर्भरताओं को पता चलेगा? –

4

मुझे पिंपल नहीं पता, लेकिन मुझे पता है कि DI इंजन आपके हाथों से तात्कालिकता लेता है। आपकी वस्तुएं उनकी निर्भरताओं के उदाहरण नहीं बनाती हैं। इसके बजाए, डीआई इंजन उन्हें बनाता है और अनुरोध पर उन्हें बाहर निकाल देता है।

तो यदि आपका PHP कोड नए उदाहरण बना रहा है, तो मुझे लगता है कि आपको इसे बदलना चाहिए ताकि आपका कोड DI इंजन प्राप्त कर सके और उससे निर्भरता मांगे।

+0

पिंपल सिर्फ एक कंटेनर इंजन नहीं है, यह तत्कालता को संभाल नहीं सकता है। – erdeszt

+2

तो कौन पिंपल के लिए तत्काल है? मुझे बिंदु नहीं दिख रहा है अगर यह ऑब्जेक्ट्स नहीं बना सकता है। – duffymo

+1

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

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