Php 从教程中理解Zend DI示例

Php 从教程中理解Zend DI示例,php,dependency-injection,zend-framework2,Php,Dependency Injection,Zend Framework2,我无法理解这个例子: //在某个引导程序中 $di=new Zend\di\di(); $di->instanceManager()->setParameters('MyLibrary\DbAdapter',数组( 'username'=>$config->username, “密码”=>$config->password )); //每个控制器内部 $movieLister=$di->get('MyMovieApp\movieLister'); foreach($movieLister作为$m

我无法理解这个例子:

//在某个引导程序中
$di=new Zend\di\di();
$di->instanceManager()->setParameters('MyLibrary\DbAdapter',数组(
'username'=>$config->username,
“密码”=>$config->password
));
//每个控制器内部
$movieLister=$di->get('MyMovieApp\movieLister');
foreach($movieLister作为$movie){
//迭代并显示$movie
}
源代码的另一部分(“每个控制器内部”)如何知道$di变量

这不是一个完整的例子吗?有人能告诉我如何在我的控制器中使用DI容器吗


教程页面:

我认为你应该阅读这篇文章,以便对未来的研究有一个感性的认识:

您还应查看:


粗略地说,Zend/Mvc/应用程序中的ServiceManager做了大量的Di工作。

该示例没有说明如何将
MyMovieApp\MovieLister
注入控制器,而不是调用
Zend\Di\Di::get()
;后者假设DIC本身已注入控制器,这确实是一种反模式

老实说,这实际上是ZF2 mvc控制器当前默认实现的一个缺点,ZF2 mvc控制器中注入了
ServiceManager
(主要出于性能原因,它取代了
Di
)。这个问题已经过广泛讨论,很可能会在ZF3中讨论


目前,只需使用
ServiceManager
,忽略它被注入控制器的事实,并在具体的服务工厂中使用构造函数注入。这是目前在ZF2中进行IoC的最佳公认方法,它是可靠的,绝不是一个坏的做法。

Zend Framework 2教程中的示例介绍了如何在整个框架环境之外使用特定组件,让您更好地了解其功能

Zend开发人员的一个基本想法是创建一个独立库包(需要时它们之间只有一些依赖项),让您选择要使用框架的哪一部分。例如,您可以使用
DI
类并在其他框架中使用它。它会很好用的。当他们说

内部控制器

他们的意思是

不一定是我们的控制员,你也可以是其他人

请注意,这只是ZF2的一个使用示例,但它实际上并不属于框架本身


因此,在任何地方获得
Di
对象的方式取决于您的应用程序体系结构。如果您考虑使用整个ZF2,那么您可能根本不会自己创建
Di
对象
Di
将由
ServiceLocator
使用,它将允许您管理您的服务(对象、工厂等)。

不要使用
Zend\Di
使用ServiceManager是错误的做法,因为它是服务定位器,反模式。这不是真的。使用
getServiceLocator()
是一种不好的做法。一般来说,服务经理是一种不错的做法。它基本上和您的DI相同,只是使用了另一个名称,而且更易于配置。我了解如何使用ServiceManager:)