2

我是 ZendFramework 2 和整个 DI 理念的新手。

这是我需要实现的目标:

  1. 创建许多扩展单个 AbstractModel 的模型类
  2. 使用具有依赖关系的 DI 提供 AbstractModel(在我的情况下是学说实体管理器)
  3. 在我需要的地方使用祖先类作为普通类

为了更好地解释 3. 让我们看看这个例子:

class Ancestor extends Parent { }

在控制器中,或者理想的任何地方:

$ancestor = new Ancestor();
$ancestor->doStuffWithEntityManager();

在初始化祖先时,它必须已经知道注入的资源。

这甚至可能吗?如果不以默认形式使用,我可以通过一些服务管理器等初始化祖先,只要我不需要指定每个祖先。我需要告诉 zend:将这个和那个注入到每个扩展/实现 X 的类中。

有任何想法吗?

PS:正如我所说的我很新,所以请指定配置/类文件我必须添加每段示例代码。

4

3 回答 3

6

在我的架构中,我这样做如下。首先:我创建一个服务:

class Module 
{
    public function getServiceConfig()
    {
        return array(
            'factories' => array(
                'my-service-name'   => 'MyNamespace\Factory\MyServiceFactory'
            )
        );
    }
}

然后我创建ServiceFactory。这将是处理所有依赖项的地方。

<?php
namespace MyNamespace\Factory;

use Zend\ServiceManager\ServiceLocatorInterface;
use Zend\ServiceManager\FactoryInterface;
use MyNamespace\Service\SomeService;

class MyServiceFactory implements FactoryInterface
{
    /**
     * Create service
     *
     * @param ServiceLocatorInterface $serviceLocator
     * @return \MyNamespace\Service\SomeService
     */
    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        $service = new SomeService();
        $service->setEntityManager($serviceLocator->get('Doctrine\ORM\EntityManager'));
        return $service;
    }
}

MyService-Class 甚至可以有更多的依赖关系,在我的例子中,由于它们实现的接口,它们会自动注入。您可以在此处查看示例。然后,特定的 EntityService 将只需要一个定义存储库的函数,就像这里的示例一样。

可能还会建议您阅读Rob Allens 对 ServiceManager 配置键的介绍。具体阅读“初始化程序”部分,我想这是您主要关心的问题?

我希望这涵盖了您的问题。

于 2012-11-16T09:22:31.330 回答
1

您可以注入创建自定义存储库类的实体管理器并将其注入覆盖 find* 方法调用

在 Doctrine 2.0 实体中使用 EntityManager

但是我建议您检查您的设计,因为它不是从实体对数据库的正常调用

于 2012-11-16T09:08:52.063 回答
-1
class Parent {
    private $em;

    public function __construct(\Doctrine\ORM\EntityManager $em) {
        $this->em = $em;
    }
}

class Ancestor extends Parent { }

// To use, create an EntityManager $em

$ancestor = new Ancestor($em);
$ancestor->doStuffWithEntityManager(); // Uses $this->em internally

这就是依赖注入的全部内容。另见http://fabien.potencier.org/article/11/what-is-dependency-injection

在这里查看在 ZF2 中获取/创建 EntityManager:http: //samminds.com/2012/07/a-blog-application-part-1-working-with-doctrine-2-in-zend-framework-2/

本质上,在从您扩展的控制器中,AbstractActionController您可以执行以下操作:

$this->getServiceLocator()->get('Doctrine\ORM\EntityManager');
于 2012-11-16T08:25:17.223 回答