我无法理解这个例子:
// inside a bootstrap somewhere
$di = new Zend\Di\Di();
$di->instanceManager()->setParameters('MyLibrary\DbAdapter', array(
'username' => $config->username,
'password' => $config->password
));
// inside each controller
$movieLister = $di->get('MyMovieApp\MovieLister');
foreach ($movieLister as $movie) {
// iterate and display $movie
}
另一部分源代码(“每个控制器内部”)如何知道$ di变量?
未完成的例子吗?任何人都可以展示我如何在我的控制器中使用DI容器吗?
教程页面:http://framework.zend.com/manual/2.0/en/modules/zend.di.quick-start.html
答案 0 :(得分:1)
Zend Framework 2教程中的示例描述了如何使用特定组件在整个框架环境之外来让您更好地理解其功能。
Zend开发人员的一个基本想法是始终创建一个独立库包(在需要时只有一些依赖关系),让您选择要使用的框架部分。例如,您可以使用DI
类并在其他框架中使用它。它会工作正常。当他们说
他们的意思是
不一定是我们的控制器你也是其他人
请注意,ZendSkeletonApplication
只是ZF2的一个使用示例,但它实际上并不属于框架本身。
因此,在任何地方获得Di
对象的方式取决于您的应用程序架构。如果您在使用整个ZF2的背景下思考,那么您可能根本不会创建Di
对象。 Di
将使用ServiceLocator
来管理您的服务(对象,工厂等)。
答案 1 :(得分:0)
我认为你应该阅读这篇文章,以便对未来的研究有所了解:
你也应该看看:
https://github.com/zendframework/ZendSkeletonApplication
粗略地说,Zend / Mvc / Application中的ServiceManager做了大量的工作。
答案 2 :(得分:0)
该示例缺少关于如何配置控制器注入MyMovieApp\MovieLister
的指示,而不是调用Zend\Di\Di::get()
;后者假设DIC本身已注入控制器,这确实是反模式。
说实话,这实际上是ZF2 mvc控制器当前默认实现的缺点,它们注入了ServiceManager
(主要出于性能原因而取代Di
) 。这个问题已经得到了广泛的讨论,很可能会在ZF3中得到解决。
目前,只需使用ServiceManager
,忽略将其注入控制器,并在具体服务工厂内使用构造函数注入的事实。这是目前在ZF2中做IoC最公认的方法,它是可靠的,绝不是一种不好的做法。