2013-07-29 32 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。 –

相关问题