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