使用Zend 2依赖注入(Zend \ DI \ DI)注入对象属性或方法

时间:2013-02-05 20:18:43

标签: php dependency-injection zend-framework2

我目前正在使用类似于Pimple的类来管理依赖注入。例如,如果我想要检索依赖于配置类的数据库连接的实例,我会这样做:

$DI = new DIContainer;

$DI->Config =
     $DI->share = function($c){
           return new Config;
     };

$DI->Database =
     $DI->share = function($c){

          $cfg = $c->Config;

          $host = $cfg->getDbHost();
          $username = $cfg->getDbUsername();
          $password = $cfg->getDbPassword();
          $name = $cfg->getDbName();

          return new \mysqli($host, $username, $password, $name);
     };

简单来说:$ DI-> Config总是返回配置类的相同实例,$ DI->数据库将始终返回相同的数据库连接,不是注入Config对象本身,而是注入几个属性对象(主机,用户等)。

当然,这意味着必须在运行时设置容器,我正在考虑转移到Zend Framework 2的依赖注入容器(允许传递定义列表)。

但是,我找不到一个关于如何在Zend \ Di \ Di中注入对象属性而不是对象本身的示例。这有可能吗?你知道有什么例子吗?

1 个答案:

答案 0 :(得分:0)

我不熟悉疙瘩,并不完全确定你在问什么,但这里有一些一般信息......

Zend Di充当Service Locator,意味着它维护对象实例的注册表,并始终返回所请求的每个对象的相同实例。因此,您应该能够轻松地让Zend Di始终返回相同的数据库连接(等)而不做任何花哨的事情,这是它的默认行为。

对象属性/属性的注入不是您在给出的示例中所做的;相反,该示例看起来像“构造函数注入”:在构造mysqli对象时注入参数/参数。 Zend Di很好地支持构造函数注入。

Zend Di的创始人Ralph Schindler对Zend Di有一个彻底的repository of example use-cases,在那里你应该能找到你想做的大多数事情的参考资料。

具体来说,也许你正在寻找的是Ralph's example here,它利用构造函数注入包括配置参数。

所有这一切,许多ZF2开发人员更喜欢Zend ServiceManager而不是Zend Di. ServiceManager是ZF2的默认设置,它也像Zend Di一样充当​​服务定位器,但它的用法与Pimple更相似。如果您正在从疙瘩过渡,那么您可能会更加熟悉ServiceManager。