2012-10-25 12 views
6

मुझे कोई समस्या है। मैं एक नियंत्रक के बिना इकाई प्रबंधक प्राप्त करने का प्रयास करता हूं, लेकिन मुझे कोई रास्ता नहीं मिला। इस समय, मैं इस तरह इकाई-प्रबंधक मिलती है:जेडएफ 2 और एंटिटी मैनेजर (सिद्धांत)

(Controller) 
public function getEntityManager() 
{ 
    if (null === $this->_em) { 
     $this->_em = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager'); 
    } 
    return $this->_em; 
} 

(Plugin) 
public function getEntityManager() 
{ 
    if($this->_em == null){ 
     $this->_em = $this->getController()->getServiceLocator()->get('doctrine.entitymanager.orm_default'); 
    } 
    return $this->_em; 
} 

तुम देखो, मैं allways एक नियंत्रक की जरूरत है। लेकिन, अगर मुझे मॉडल में EntityManager की आवश्यकता है, तो मुझे एक समस्या है। मैं मॉडल को नियंत्रक दे सकता हूं, लेकिन मुझे लगता है कि यह वास्तव में एक बुरा तरीका है।

क्या आपको कोई नियंत्रक के बिना EntityManager प्राप्त करने का कोई विचार है?

उत्तर

7

तरह से मैं संभाल सिद्धांत सेवाओं के माध्यम से है, मैं तो वह ऐसा कार्य करें:

//some Controller 
public function someAction() 
{ 
    $service = $this->getServiceLocator()->get('my_entity_service'); 
    return new ViewModel(array(
     'entities' => $service->findAll() 
    )); 
} 

Service->findAll() कुछ इस तरह दिखेगा:

public function findAll() 
{ 
    return $this->getEntityRepository()->findAll(); 
} 

अब हम my_entity_service परिभाषित करने की जरूरत। मैं अपने Module.php

public function getServiceConfig() 
{ 
    return array(
     'factories' => array(
      'my_entity_service' => 'Namespace\Factory\MyServiceFactory' 
     ) 
    ); 
} 

अगला अंदर ऐसा करने मैं बनाने फैक्टरी (ध्यान दें: यह भी Module.php अंदर गुमनाम समारोह के माध्यम से किया जा सकता है)

<?php 
namespace Namespace\Factory; 

use Zend\ServiceManager\ServiceLocatorInterface; 
use Zend\ServiceManager\FactoryInterface; 
use Namespace\Model\MyModel; 

class MyServiceFactory implements FactoryInterface 
{ 
    /** 
    * Create service 
    * 
    * @param ServiceLocatorInterface $serviceLocator 
    * @return mixed 
    */ 
    public function createService(ServiceLocatorInterface $serviceLocator) 
    { 
     $myModel= new MyModel(); 
     $myModel->setEntityManager($serviceLocator->get('Doctrine\ORM\EntityManager')); 

     return $myModel; 
    }  
} 

अब इस चबाना एक बहुत है: डी पूरी तरह से मिलता है। यद्यपि यहां क्या हो रहा है वास्तव में बहुत सरल है। अपना मॉडल बनाने के बजाय और किसी भी तरह EntityManager पर पहुंचने के लिए, आप ZF2 के सर्विस मैनेजर को मॉडल बनाने के लिए कॉल करते हैं और इसमें EntityManager इंजेक्ट करते हैं।

यदि यह अभी भी आपको भ्रमित कर रहा है, तो मैं खुशी से खुद को बेहतर समझाने की कोशिश करूंगा। आगे स्पष्टीकरण के लिए हालांकि मैं आपके उपयोग के मामले के बारे में जानना चाहता हूं। I.e: आपको EntityManager की आवश्यकता है या आपको इसकी आवश्यकता कहां है।

इस कोड उदाहरण सवाल दायरे के बाहर है

बस आप कुछ का लाइव उदाहरण मैं क्या ServiceFactories के माध्यम से रूपों के साथ देने के लिए: कैसे करने के लिए

public function createService(ServiceLocatorInterface $serviceLocator) 
{ 
    $form = new ReferenzwertForm(); 
    $form->setHydrator(new DoctrineEntity($serviceLocator->get('Doctrine\ORM\EntityManager'))) 
     ->setObject(new Referenzwert()) 
     ->setInputFilter(new ReferenzwertFilter()) 
     ->setAttribute('method', 'post'); 

    return $form; 
} 
4

आपका असली सवाल यह है कि "अपने स्वयं के वर्गों में सेवा प्रबंधक का एक उदाहरण प्राप्त करें "

इसके लिए, डॉकू पर एक नज़र डालें: (पृष्ठ http://zf2.readthedocs.org/en/latest/modules/zend.service-manager.quick-start.html का पृष्ठ)

डिफ़ॉल्ट रूप से, Zend फ्रेमवर्क MVC एक प्रारंभकर्ता कि ServiceManager उदाहरण, Zend \ ServiceManager \ ServiceLocatorInterface के एक कार्यान्वयन है जो इंजेक्षन जाएगा किसी भी वर्ग Zend \ ServiceManager \ ServiceLocatorAwareInterface को लागू करने में, पंजीकृत करता है। एक सरल कार्यान्वयन निम्न की तरह दिखता है।

तो अपनी कक्षाओं में ServiceLocatorInterface implent और फिर अपने वर्ग के भीतर आप कॉल कर सकते हैं:

$this->getServiceLocator()->get('doctrine.entitymanager.orm_default'); 

या किसी अन्य सेवा आप पंजीकृत किया है।

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