我正在学习ztr2 with doctrine2。
Doctrine2实体不适合在那里放置逻辑,因此我必须创建类似服务的东西。
我在src - Service中创建了新目录,我想我将创建abstractService类,它将默认访问doctrine2实体管理器,以及其他有用的东西。
但我不知道如何实现它,我创建了构造函数,我应该通过注入传递对象管理器的实例,但我不知道如何做到这一点。所有找到的例子都是控制器。
有人可以指示我管理/组织它吗?
我没有找到任何解决方案。
答案 0 :(得分:0)
您可以使用eighter doctrine.entitymanager.orm_default
或别名Doctrine\ORM\EntityManager
从服务管理器检索默认的doctrine实体管理器。
$serviceLocator->get('Doctrine\ORM\EntityManager');
ZF2中依赖项注入的最佳实践是使用您在服务管理器上注册的服务工厂。有很多关于此的信息。
无论如何,我会解释这些步骤。
您的服务
namespace MyNamespace
class MyService
{
public function __construct(EntityManager $em)
{
$this->em = $em;
}
}
<强>工厂强>
在module.php
class Module
{
public function getServiceConfig()
{
return array(
'factories' => array(
'MyNamespace\MyService' => function($serviceLocator) {
return new MyService($serviceLocator->get('Doctrine\ORM\EntityManager');
}
)
);
}
}
我在本例中使用了工厂的闭包,但建议使用专用的工厂类。
现在,您可以从服务管理器中检索完全组合的服务。
$serviceManager->get('MyNamespace\MyService');
如果您想在控制器中使用此服务,您需要以与上述相同的方式为此定义工厂。只有一个小区别,因为所有控制器都由一个单独的pluginManager(一个专门用于创建某种类型的类的serviceManager)管理。您可以使用module.php中的方法getControllerConfig
在控制器插件管理器上定义工厂。
将此添加到您的module.php
public function getControllerConfig()
{
return array(
'factories' => array(
'MyNamespace\Controller\MyController' => function($serviceLocator)
{
$rootLocator = $serviceLocator->getServiceLocator();
$service = $rootLocator->get('MyNamespace\MyService');
return new MyController($service);
}
)
);
}
希望这有帮助。