我有问题。我尝试在没有控制器的情况下获得Entity-Manager,但我没有找到办法。 这时,我得到了这样的实体经理:
(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?
答案 0 :(得分:7)
我处理Doctrine的方式是通过Services,我这样做:
//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;
}
}
现在要咀嚼很多东西:D我完全明白了。这里发生的事情实际上非常简单。您可以调用ZF2的ServiceManager来为您创建模型,并将EntityManager注入其中,而不是创建模型并以某种方式进入EntityManager。
如果这仍然让你困惑,我会很乐意尝试更好地解释自己。为了进一步说明,我想了解您的用例。即:您需要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;
}
答案 1 :(得分: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。一个 简单的实现如下所示。
所以在你的类中实现ServiceLocatorInterface,然后在你的类中调用:
$this->getServiceLocator()->get('doctrine.entitymanager.orm_default');
或您已注册的任何其他服务。