我处理Doctrine的方式是通过服务,我像下面这样做:
我通过服务来处理Doctrine,做法如下:
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
{
public function createService(ServiceLocatorInterface $serviceLocator)
{
$myModel= new MyModel();
$myModel->setEntityManager($serviceLocator->get('Doctrine\ORM\EntityManager'));
return $myModel;
}
}
现在这里的内容可能有些费解:D,但实际上所发生的事情非常简单。您不必创建模型然后以某种方式到达EntityManager,而是调用ZF2的ServiceManager为您创建模型,并将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;
}