2012-10-25 108 views
6

我有一個問題。我試圖在沒有控制器的情況下獲得實體管理器,但我找不到任何方法。 在這個時候,我得到的實體 - 經理這樣的:ZF2和EntityManager(Doctrine)

(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?

回答

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

現在,這是一個很大的咀嚼: DI完全明白這一點。這裏發生的事情其實很簡單。您不需要創建模型並以某種方式進入EntityManager,而是調用ZF2的ServiceManager爲您創建模型並將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

你真正的問題是「如何在我自己的類中獲得一個ServiceManager的實例

爲此,請查看文檔:(頁面http://zf2.readthedocs.org/en/latest/modules/zend.service-manager.quick-start.html的底部)

默認情況下,Zend Framework的MVC註冊一個初始化,將 注入的ServiceManager的實例,這是 Zend的\的ServiceManager \ ServiceLocatorInterface的實現,爲實現Zend的\的ServiceManager \ ServiceLocatorAwareInterface任何類 。 A 簡單實現如下所示。

所以implent的ServiceLocatorInterface在你的類,然後你的類中,你可以撥打:

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

或任何其他服務在您註冊。

相關問題