2013-07-29 68 views

回答

4

有幾種方法可以解決這個問題。骯髒的,但更簡單的方法就是隻給表單在您的控制器操作實體管理器槽設置了一個param像這樣:

/**    
* @var Doctrine\ORM\EntityManager 
*/     
protected $em; 

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

public function setEntityManager(EntityManager $em) 
{ 
    $this->em = $em; 
} 
... 
public function yourAction() { 
... 
    $form = new YourForm($this->getEntityManger()); 
... 
} 

然後,您可以直接打電話給你的表格中的實體管理器的方法:

public function __construct($em) 
{ 
... 
    $repository = $em->getRepository('\Namespace\Entity\Namespace'); 
... 
} 

更復雜的,但更好的方式要求您將模塊中添加getServiceconfig功能Module.php:

public function getServiceConfig() 
{ 
    return array(
     'factories' => array(
      'YourFormService' => function ($sm) { 
       $form = new YourForm($sm); 
       $form->setServiceManager($sm); 
       return $form; 
      } 
     ) 
    ); 
} 

在表單您需要同時implent的ServiceManagerAwareIn terface和setServiceManager設置器。

use Zend\Form\Form as BaseForm; 
use Zend\ServiceManager\ServiceManager; 
use Zend\ServiceManager\ServiceManagerAwareInterface; 

class CategoryForm extends BaseForm implements ServiceManagerAwareInterface 
{ 
protected $sm; 

public function setServiceManager(ServiceManager $sm) 
{ 
    $this->sm = $sm; 
} 

public function __construct($sm) 
{ 
... 
$em = $sm->get('Doctrine\ORM\EntityManager'); 
... 
} 

然後您必須以不同方式在您的控制器中調用您的窗體。通常的$form = new YourForm();構造函數不適用於我們創建的工廠。

$form = $this->getServiceLocator()->get('YourFormService'); 

我通常用骯髒的方式來獲得的EntityManager,但只要我需要的服務定位器我親手創建一個工廠我不認爲它值得它來創建一筆大開銷的服務。

我希望這有所幫助。

+1

如果選擇第二項,只是注入實體管理器將是最好的方法,不需要注入整個服務管理器。 –

+0

非常感謝你們的回答! 我嘗試了第一種方法,但它給了我錯誤 - 「_construct()必須是Doctrine \ ORM \ EntityManager的實例,null給出...」。 我會稍後嘗試使用serviceManager的第二種方法(現在我很忙),我會評論結果。 – user2623505

+0

您不必在對象上手動設置ServiceService()。如果類是instanceof ServiceLocatorAwareInterface,則最好將此服務註冊爲可調用的而不是工廠。服務管理器將自動注入ServiceLocator。 –

相關問題