doctrine ZF2 और EntityManager(सिद्धांत)




zend-framework2 (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;
}

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

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


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

इसके लिए, दस्तावेज को देखें: (पृष्ठ के नीचे http://zf2.readthedocs.org/en/latest/modules/zend.service-manager.quick-start.html )

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

तो अपने कक्षा में ServiceLocatorInterface को इन्सेंट करें और उसके बाद आप अपनी कक्षा में कॉल कर सकते हैं:

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

या आपके द्वारा पंजीकृत कोई अन्य सेवा


जिस तरह से मैं सिद्धांत को संभालता हूं वह सेवाओं के माध्यम से है, मैं इसे निम्नलिखित की तरह करता हूं:

//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 के ServiceManager को कॉल करें और इसमें EntityManager इंजेक्ट करें।

अगर यह अभी भी आपके लिए भ्रामक है, तो मैं ख़ुशी से अपने आप को बेहतर ढंग से समझाऊंगा। अधिक स्पष्टीकरण के लिए, हालांकि मैं आपके उपयोग केस के बारे में जानना चाहता हूं। यानी: आपको एंटिटी मैनेजर की ज़रूरत क्या है या आपको इसकी ज़रूरत क्या है।

यह कोड उदाहरण प्रश्न क्षेत्र से बाहर है

सिर्फ आपको कुछ के साथ सेवा फॅक्टरीज के माध्यम से किया जाने वाला एक जीवंत उदाहरण देता हूं:

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;
}