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