在类中使用工厂而不在ZF2中注入整个服务管理器

时间:2013-12-06 16:26:20

标签: php dependency-injection zend-framework2

我有一个名为 classB 的类,它有多个依赖项,我使用 ClassBFactory 进行设置。在 classA 里面我想使用 classBFactory 创建 classB 的新实例。

通过将整个服务容器注入 classA ,是从工厂获取 classB 的新实例的唯一方法,还是有另一种方法?传递整个服务容器似乎是不好的做法,因为这会使类访问的次数远远超过需要。

我已经尝试了以下但是这不起作用,因为createService()需要服务容器,我宁愿不注入classA

class ClassA {
    protected $classBFactory;
    public function __construct(ClassBFactory $classBFactory)
    {
        $this->classBFactory = $classBFactory;
    }

    public function getNewA()
    {
        return $this->classBFactory->createService();
    }
}

1 个答案:

答案 0 :(得分:0)

只需为classA创建一个工厂,然后将classB注入classA。在您的工厂中,从服务定位器中拉出ClassB,并将其与构造函数注入到ClassA中。 您应该尝试不让您的类依赖于serviceLocator,原因有多种,但只允许您的工厂从servicelocator中取出并使用构造函数或setter注入注入这些依赖项(这称为控制反转)。

<强> ClassA的

class ClassA {
    protected $classB;
    public function __construct(ClassB $classB)
    {
        $this->classB = $classB;
    }
}

<强> Module.php

public function getServiceConfig()
{
    return array(
        'factories' => array(
            'MyNamespace\ClassA' => function($sm) {
                return new ClassA($sm->get('MyNamespace\ClassB'));
            }, //Using a closure here, but it's better to create a seperate factory class
            'MyNamespace\ClassB' => 'MyNamespace\Factory\ClassBFactory'
        )
    )
}