【问题标题】:ZF2 Dependancy Injection Alias and multiple instancesZF2 依赖注入别名和多实例
【发布时间】:2012-04-16 11:23:32
【问题描述】:

我们目前正在 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?

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

【问题讨论】:

    标签: php dependency-injection zend-framework2


    【解决方案1】:

    来自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-&gt;get() 的第一个参数

    【讨论】:

      【解决方案2】:
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2016-10-23
        • 1970-01-01
        • 1970-01-01
        • 2013-01-21
        • 1970-01-01
        • 2020-03-25
        • 2010-09-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多