9

ज़ेंड और अच्छे ब्लॉगर्स के अच्छे लोग, इनबिल्ट निर्भरता इंजेक्शन सिस्टम की बजाय ZF2 के लिए नए सेवा लोकेटर/प्रबंधक की सिफारिश कर रहे हैं।जेडएफ 2 सेवा लोकेटर और निर्भरता इंजेक्शन

मेरा सवाल है, क्या यह सेवा में नकली वस्तुओं को इंजेक्ट करना संभव/सुविधाजनक है? मैंने मॉड्यूल के PHPUnit बूटस्ट्रैप में ऐसा करने के लिए कुछ थोड़ा बेकार प्रयास किए हैं; लेकिन क्या इस सेवा प्रणाली का उपयोग करने का कोई तरीका है जो कि ZF1 + यादिफ कहता है, जैसा कि स्वच्छ और सुविधाजनक है?

उत्तर

12

हां, आप एक सेवा में नकली वस्तुओं को इंजेक्ट कर सकते हैं। एक इकाई परीक्षण के लिए, सेवा लोकेटर भी खेलने में नहीं आता:

$service = new MyService($mockDependency); 

आप जटिल एकीकरण परीक्षणों जहां निर्भरता और mocks, आप कर सकते हैं का ग्राफ साथ विन्यस्त किया जा करने के लिए सेवा लोकेटर उपयोग करने की आवश्यकता लिख ​​रहे हैं, तो मैं अपने मॉड्यूल के साथ क्या कर रहा हूँ की तरह सेटअप कुछ:

$serviceLocator = ServiceManagerFactory::getServiceManager(); // see comment below 
$dbConnectionMock = $this->getMock('My\Db\Connection'); 

$serviceLocator->setAllowOverride(true); 
// replacing connection service with our fake one 
$serviceLocator->setService('connection_service_name', $dbConnectionMock); 

$service = $serviceLocator->get('service_that_uses_a_connection'); 

आप https://github.com/doctrine/DoctrineORMModule/blob/0.7.0/tests/DoctrineORMModuleTest/Util/ServiceManagerFactory.php

पर DoctrineORMModule में ServiceManagerFactory का एक उदाहरण मिल सकता है यह मानते हुए काम करता है कि service_that_uses_a_connection को ऐसे फैक्ट्री द्वारा तत्काल किया जाता है जो connection_service_name इंजेक्ट करता है।

यदि आप चाहें तो भी आप Zend\Di का उपयोग कर सकते हैं, लेकिन इस तरह के मामलों में इसकी वास्तव में आवश्यकता नहीं है।

+1

आपकी मदद के लिए धन्यवाद! उम्मीद है कि एक दिन ज़ेंड दस्तावेज यह स्पष्ट होगा! – AgileTillIDie

+2

@AgileTillIDie कृपया स्वयं को योगदान दें! https://github.com/zendframework/zf2- दस्तावेज - यदि आपको कोई जीआईटी-फू नहीं मिला है, तो भी आप इसे गीथूब यूआई में ऑनलाइन संपादित कर सकते हैं। – Ocramius