gpt4 book ai didi

doctrine - ZF2 和 EntityManager( Doctrine )

转载 作者:行者123 更新时间:2023-12-04 10:41:03 25 4
gpt4 key购买 nike

我有个问题。我尝试在没有 Controller 的情况下获取实体管理器,但我没有找到办法。
此时,我得到这样的实体管理器:

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

你看,我总是需要一个 Controller 。但是,如果我需要模型中的 EntityManager,我就有问题了。我可以给模型 Controller ,但我认为这确实是一个糟糕的方法。

你有什么想法在没有 Controller 的情况下获得 EntityManager 吗?

最佳答案

我处理 Doctrine 的方式是通过服务,我这样做如下:

//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我完全明白。这里发生的事情实际上非常简单。您无需创建模型并以某种方式访问​​ EntityManager,而是调用 ZF2 的 ServiceManager 为您创建模型并将 EntityManager 注入(inject)其中。

如果这仍然让您感到困惑,我很乐意尝试更好地解释自己。但是,为了进一步澄清,我想了解您的用例。即:你需要什么 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;
}

关于doctrine - ZF2 和 EntityManager( Doctrine ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13065245/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com