3

我们目前正在 Zend Framework 2 中编写一个模块。

我在查找这方面的文档时遇到了一些麻烦,但我知道这是可能的。

我想通过依赖注入来设置层次结构中的 3 个类。让我们称这些类;A 类、B 类和 C 类。

ClassA 包含一个 ClassB 实例数组,ClassB 包含一个 ClassC 实例数组。ClassB 的每个实例都应该使用不同的参数进行实例化。这同样适用于 C 类。所有 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;
    }
}

所以他们是我问题的两个部分。首先,如何配置注入不同参数的同一类的多个实例?例如,ClassB 的多个实例,每个实例都有自己的 ClassC 实例子集。ZF2 DiC 中必须有某种别名。

其次,我如何将一组重新配置依赖项注入到一个类中。例如,如何将 ClassB 实例数组注入 ClassA?

如果可能,请在 module.config.php 的 DI 部分中提供直接使用 DiC 的示例以及实现此目的的示例。

4

3 回答 3

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

于 2012-05-08T03:32:34.817 回答
0

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

于 2012-09-28T21:55:24.033 回答
0

文档中,我认为这应该有效:

// $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()

于 2012-04-17T05:04:41.810 回答