ZF2依赖注入别名和多个实例

时间:2012-04-16 11:23:32

标签: php dependency-injection zend-framework2

我们目前正在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部分实现此目的的示例。

3 个答案:

答案 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 aliasfull qualified namespace作为$di->get()的第一个参数

答案 1 :(得分:0)

答案 2 :(得分:0)

我刚刚写了一篇关于这个主题的文章。我个人不使用Di类或DiC,但希望您会发现这些概念可以直接应用于您的问题,尤其是第2部分,无论您选择使用什么作为您的IoCC。 http://zendblog.shinymayhem.com/2012/09/using-servicemanager-as-inversion-of.html