在zf2中使用默认的doctrine2连接创建自己的服务

时间:2013-10-25 08:53:29

标签: doctrine-orm zend-framework2

我正在学习ztr2 with doctrine2。

Doctrine2实体不适合在那里放置逻辑,因此我必须创建类似服务的东西。

我在src - Service中创建了新目录,我想我将创建abstractService类,它将默认访问doctrine2实体管理器,以及其他有用的东西。

但我不知道如何实现它,我创建了构造函数,我应该通过注入传递对象管理器的实例,但我不知道如何做到这一点。所有找到的例子都是控制器。

有人可以指示我管理/组织它吗?

我没有找到任何解决方案。

1 个答案:

答案 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);
            }
        )
    );
}

希望这有帮助。