我目前正在使用类似于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中注入对象属性而不是对象本身的示例。这有可能吗?你知道有什么例子吗?
答案 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。