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

Php 在类中使用工厂而不在ZF2中注入整个服务管理器,php,dependency-injection,zend-framework2,Php,Dependency Injection,Zend Framework2,我有一个名为classB的类,它有多个依赖项,我正在使用ClassBFactory设置这些依赖项。在classA中,我想使用classBFactory创建classB的一个新实例 将整个服务容器注入classA是从其工厂获得classB新实例的唯一方法,还是有其他方法?传入整个服务容器似乎是一种不好的做法,因为这将使类能够访问比需要多得多的内容 我已经尝试过以下内容,但这不起作用,因为createService()需要服务容器,我不希望将其注入classA class ClassA {

我有一个名为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();
    }
}

只需为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'
        )
    )
}

感谢您的回复,但我需要获取
ClassA
以返回
classB
的新实例,例如在方法
getNewA()
中。我已经更新了这个问题以使其更清楚。对于这个用例,我可以使用
get
注入ServiceManager并从中检索classA。请确保将服务的shared设置为false,否则在连续调用时将得到相同的实例。