0

我目前正在使用与 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->Database 总是返回相同的数据库连接,注入的不是 Config 对象本身,而是对象的几个属性(主机、用户等)。

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

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

4

1 回答 1

0

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

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

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

Zend Di 的创建者 Ralph Schindler 拥有一个完整的 Zend Di示例用例存储库,您应该能够在其中找到大多数您想做的事情的参考资料。

具体来说,也许您正在寻找的是Ralph 的示例 here,它利用了包含配置参数的构造函数注入。

尽管如此,许多 ZF2 开发人员更喜欢 Zend ServiceManager 而不是 Zend Di。ServiceManager 是 ZF2 的默认设置,它也像 Zend Di 一样充当服务定位器,但它的用法更类似于 Pimple。如果您正在从 Pimple 过渡,您可能会更熟悉 ServiceManager。

于 2013-02-06T15:39:35.647 回答