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

Doctrine orm 在zf2中使用默认doctrine2连接创建自己的服务,doctrine-orm,zend-framework2,Doctrine Orm,Zend Framework2,我正在和Doctorine2一起学习zf2 Doctrine2实体不是放置逻辑的好地方,所以我必须创建类似服务的东西 我在src-Service中创建了新的catalog,我想我将创建abstractService类,默认情况下它将访问doctrine2实体管理器和其他有用的东西 但我不确定如何实现它,我创建了构造函数,在这里我应该通过注入传递对象管理器的实例,但我不知道如何实现。所有找到的示例都是针对控制器的 有人能告诉我怎么管理/组织吗 我没有找到任何解决方案。您可以使用doctrine.e

我正在和Doctorine2一起学习zf2

Doctrine2实体不是放置逻辑的好地方,所以我必须创建类似服务的东西

我在src-Service中创建了新的catalog,我想我将创建abstractService类,默认情况下它将访问doctrine2实体管理器和其他有用的东西

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

有人能告诉我怎么管理/组织吗


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

您可以使用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);
            }
        )
    );
}
希望这有帮助