2013-05-24 5 views
11

हाय मैं फ्रेमवर्क को ज़ेन करने के लिए नया हूं। सेवा प्रबंधक पर पकड़ने की कोशिश करो। Zend फ्रेमवर्क प्रलेखन पर आधार, यह कहा:इनवोकैबल्स और कारखानों के बीच ज़ेंड फ्रेमवर्क 2 सर्विस मैनेजर अंतर

कारखानों, सेवा का नाम/कारखाने वर्ग के नाम जोड़े की एक सरणी। कारखानों या तो ज़ेंड \ ServiceManager \ FactoryInterface या invokable कक्षाओं को लागू करने वाले वर्ग होना चाहिए। यदि आप PHP कॉन्फ़िगरेशन फ़ाइलों का उपयोग कर रहे हैं, तो आप कारखाने के रूप में किसी भी PHP को कॉल करने योग्य प्रदान कर सकते हैं।

invokables, सेवा नाम/कक्षा नाम जोड़े की एक सरणी। कक्षा का नाम कक्षा होना चाहिए जो सीधे किसी भी कन्स्ट्रक्टर तर्क के बिना तत्काल हो सकता है।

लेकिन मैं अभी भी अलग-अलग बीच को समझने से बाहर नहीं हूं। जब मुझे अनावश्यक के रूप में उपयोग करना चाहिए और जब मुझे कारखानों का उपयोग करना चाहिए? लाभ का उपयोग कारखानों क्या है? बहुत बहुत धन्यवाद।

उत्तर

22

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

ऑब्जेक्ट को तत्काल करने के पीछे थोड़ा और जटिल तर्क होने पर आपको कारखाने का उपयोग करना चाहिए। किसी फैक्ट्री में कोड को स्थानांतरित करने से आपको कोड को डुप्लिकेट करने में मदद मिलेगी जब कभी आपको ऑब्जेक्ट की आवश्यकता होती है।

फैक्टरी उदाहरण:

'factories' => array(
     'Application\Acl' => 'Application\Service\AclFactory', 

AclFactory.php

namespace Application\Service; 

use Zend\ServiceManager\FactoryInterface; 
use Zend\ServiceManager\ServiceLocatorInterface; 
use Zend\Permissions\Acl\Resource\GenericResource; 
use Zend\Permissions\Acl\Role\GenericRole; 

class AclFactory implements FactoryInterface 
{ 
    /** 
    * Create a new ACL Instance 
    * 
    * @param ServiceLocatorInterface $serviceLocator 
    * @return Demande 
    */ 
    public function createService(ServiceLocatorInterface $serviceLocator) 
    { 
     $acl = new \Zend\Permissions\Acl\Acl(); 
     /** 
     * Here you can setup Resources, Roles or some other stuff. 
     * If it's complex you can make a factory like this to keep 
     * the code out of the service config, and it will save you 
     * having to duplicate the code when ever you need your ACL 
     */ 

     return $acl; 
    } 

}

तुम वापस एक साधारण वर्ग चाहते हैं/वापस आपत्ति तो आप बस के रूप में कोई है, एक invokable उपयोग कर सकते हैं ऑब्जेक्ट को वापस पाने के लिए बॉयलर-प्लेट कोड की आवश्यकता होती है।

'invokables' => array(
    'MyClass'   => 'Application\Model\MyClass', 

एक और उदाहरण, नियंत्रकों के साथ:

आप कोई requried निर्भरता के साथ एक सरल नियंत्रक, है, तो एक invokable का उपयोग करें:

'invokables' => array(
    'index'   => 'Mis\Controller\IndexController', 

लेकिन कभी कभी आप के लिए अतिरिक्त निर्भरता जोड़ना चाहते हैं नियंत्रक जब आप इसे तुरंत चालू करते हैं:

'factories' => array(
     /** 
     * This could also be added as a Factory as in the example above to 
     * move this code out of the config file.. 
     */ 
     //'users' => 'Application\Service\UsersControllerFactory', 
     'users' => function($sm) { 
      $controller = new \Application\Controller\UsersController(); 
      $controller->setMapper($sm->getServiceLocator()->get('UserMapper')); 
      $controller->setForm($sm->getServiceLocator()->get('UserForm')); 

      return $controller; 
     }, 
+0

यदि मेरे पास फैक्ट्री है तो Fa का उपयोग करना अनिवार्य है ctoryInterface? क्या यह खराब फॉर्म है यदि मैं फैक्टरी क्लास कन्स्ट्रक्टर '__invoke' बनाता हूं? – Erik

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