ZF2:以正确的方式完成依赖注入

Ton*_*nov 2 php dependency-injection zend-framework class zend-framework2

我是ZendFramework 2和整个DI想法的新手.

这是我需要实现的:

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

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

class Ancestor extends Parent { }
Run Code Online (Sandbox Code Playgroud)

在控制器中,或理想情况下在任何地方:

$ancestor = new Ancestor();
$ancestor->doStuffWithEntityManager();
Run Code Online (Sandbox Code Playgroud)

Uppon初始化祖先它必须已经知道注入的资源.

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

有任何想法吗?

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

Sam*_*Sam 6

在我的架构中,我会像下面这样做.第一:我创建一个服务:

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

然后我创建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;
    }
}
Run Code Online (Sandbox Code Playgroud)

MyService-Class甚至可以具有morde依赖性,在我的情况下由于它们实现的接口而自动注入.你可以在这里看到一个例子.然后,特定的EntityService只需要一个定义存储库的函数,就像这个例子一样.

您可能还会被建议阅读Rob Allens对ServiceManager配置密钥的介绍.特别是关于'初始化者'部分的内容,我想这是您的主要问题?

我希望这能涵盖你的问题.