首先在学习laravel中看container中的container这个类的时候有点懵,这个是一个ioc Container我知道但是 这个laravel中的我不是太能看明白不知道是否能有分析过的人帮忙分析一下能有个清晰的思路 还有就是ServiceProvider这个类 也比较难以理解 好像很多都是围绕这两个类玩的,有时间的 可以一起都帮忙分析下 主要想知道他的运用原理 知其然知其所以然吗! 先行感谢了
已有的资料
zhaoyi 感谢您的文章
PHP程序员如何理解IoC/DI
PHP程序员如何理解依赖注入容器(dependency injection container)
回复内容:
你的迷糊就是被一些文章里大量的术语搞的,所谓ioc 容器的说法我觉得用服务容器的更合适,ioc只是一种思想,实现ioc可以是依赖注入,也可以服务定位器,策略模式,思想和实现之间我觉得不能混为一谈。laravel中的容器是把被依赖的类当作服务,每当需要传入被依赖的类时,比如你想使用缓存类,换句话说你现在依赖一个缓存服务时,由一个叫做容器的类负责具体的实例化,其工作就是解析类,解析出你的缓存服务是memcache还是redis,还是别的什么,然后实例化,注入到你的消费类中,如此就实现了ioc。当然这需要抽象的配合,否则你注入个别的,方法不一样当然无法工作了。
容器只是一种管理类的方式。
那么问题来了,容器怎么知道要创建哪个类的实例?也就是类是如何被解析的?这个就可以在service provider里绑定,你把需要用的实现在这里绑定,当容器需要时就知道解析到哪个类了。
那么问题又来了,程序如何知道都有哪些service provider? 这又在config/app里面定义的,专业点说注册服务。
我建议你自己亲自动手创建一个service provider 绑定一个服务,注册,又或者你玩玩别的独立的服务容器,比如pimple,把他用在你自己的项目中,就很好理解了。
至于facade,更好理解,实际是通过容器解析到实际的类,然后通过魔术方法去实际的类上执行方法。我也是醉了。
这也是很多人批评facade的原因,这东西多包装了一层语法糖而已。
Facades 是外观模式,类似代理,在 Laravel 里的作用其实就跟 PHP: class_alias
的作用类似,只是把框架里带命名空间的类变得更好记,比如:App => Illuminate\Support\Facades\App 。 另外一个好处是:Laravel 里的外观是可以很方便的自定义的,直接修改 config/app.php 里的 aliases 部分即可,比如,你觉得系统提供的 Cache 不好用,你想用自己的,直接改成你想要的类名就好了。当然外观还有一些其它的好处,也有它的弊端,比如无法直接访问真正目标对象的类常量。
Ioc Container IOC容器,上面的两篇文章讲其它已经得很清楚了。我用比较通俗的文字来讲一下:这个容器就相当于我们的工具想,我们到哪儿都带着它,用的时候从里面取出想要的工具即可。
那么 ServiceProvider 是什么呢?它就是完成了 “在出门前把工具放到工具箱” 的过程,ServiceProvider 只是把一个东西(通常是实现某个功能的服务,比如缓存,也可以放一些配置进去)在容器里注册,框架运行时会调用每一个 ServiceProvider 的 register 方法完成注册该服务并启动。
然后你就可以在控制器或者其它框架启动后的地方从容器里取出该服务实例来使用。
简单点描述就是这样,不过你可以从源码 framework/Application.php at 5.0 · laravel/framework · GitHub
类开始一点点的看运行流程。
不知道是不是你想要的。
最近看了一阵子larave,感觉:
1、IoC跟Phalcon的DI是一样的,也就是一个对象容器,核心就一个:
<code class="language-php"><span class="x">protected static $instance;</span>
</code>
Copier après la connexion
建议不要跳出laravel的范畴去理解这些概念,其实本来是十分简单的:
Service Provider:Laravel 5.1 文档攻略 ——Service Providers
Service Container: http://laravelbase.com/collections/1/47
Facades: http://laravelbase.com/collections/1/49
一切都怪这些该死的名词,大家用的不一样。
说白了服务容器就是接口,然后服务提供者就是提供服务的实现类。
例如接口Storage class ,实现类Ftp class或Local class。