我们目前正在Zend Framework 2中编写一个模块。
我在找到这方面的文档方面遇到了一些麻烦,但知道这是可能的。
我在层次结构中有3个类,我想通过依赖注入来设置。我们称之为这些课程; ClassA,ClassB和ClassC。
ClassA包含ClassB实例数组,ClassB包含ClassC实例数组。应使用不同的参数实例化ClassB的每个实例。这同样适用于ClassC。所有3个类的参数都通过构造函数传递(如果需要,也可以使用setter处理。)。
<?php
class ClassA {
protected $arrClassBInstances = array();
public function __construct( $arrClassBInstances ) {
$this->arrClassBInstances = $arrClassBInstances;
}
}
class ClassB {
protected $arrClassCInstances = array();
protected $someOtherParam = "";
public function __construct( $arrClassCInstances, $someOtherParam ) {
$this->arrClassBInstances = $arrClassCInstances;
$this->someOtherParam = $someOtherParam;
}
}
class ClassC {
protected $someParam = "";
public function __construct( $someParam ) {
$this->someParam = $someParam;
}
}
所以他们是我问题的2部分。首先,如何配置注入了不同参数的同一类的多个实例?例如,ClassB的多个实例,每个实例都有自己的ClassC实例子集。 ZF2 DiC中必须有某种别名。
其次,如何将一组重新配置依赖项注入到类中。例如,如何将ClassB实例数组注入ClassA?
如果可能,请提供一个直接使用DiC的示例,以及在module.config.php的DI部分实现此目的的示例。
答案 0 :(得分:0)
从documentation开始,我认为这应该有效:
// $event instance of \Zend\Mvc\MvcEvent
$di = $event->getTarget()->getLocator();
$paramsForA = array(
$di->get('qualified_namespaces_or_di_alias_for_b', array('arrClassCInstances'=>array(
$di->get('qualified_namespaces_or_di_alias_for_c', array('someParam'=>1)),
$di->get('qualified_namespaces_or_di_alias_for_c', array('someParam'=>2)),
))),
$di->get('qualified_namespaces_or_di_alias_for_b', array('arrClassCInstances'=>array(
$di->get('qualified_namespaces_or_di_alias_for_c', array('someParam'=>3)),
$di->get('qualified_namespaces_or_di_alias_for_c', array('someParam'=>4)),
))),
);
$classA = $di->get('qualified_namespaces_or_di_alias_for_a', array('arrClassBInstances'=>$paramsForA));
您可以使用DI alias
或full qualified namespace
作为$di->get()
的第一个参数
答案 1 :(得分:0)
以下是如何使用DI配置文件执行此操作的两个示例。参见:
https://github.com/ralphschindler/Zend_DI-Examples/blob/master/example-08.php
https://github.com/ralphschindler/Zend_DI-Examples/blob/master/example-15.php
答案 2 :(得分:0)
我刚刚写了一篇关于这个主题的文章。我个人不使用Di类或DiC,但希望您会发现这些概念可以直接应用于您的问题,尤其是第2部分,无论您选择使用什么作为您的IoCC。 http://zendblog.shinymayhem.com/2012/09/using-servicemanager-as-inversion-of.html