控制反转(Inversion of Control,缩写为IoC)将组件间的依赖关系从程序内部提到外部来管理。依赖注入(Dependency Injection)将组件的依赖通过外部以参数或其他形式注入。
DI 依赖注入
啥都不说,直接上代码
1 |
|
User控制器依赖UserModel,实例化的时候,直接注入。
IOC控制反转
先说说IOC和DI的区别吧
IOC是一种设计思想
DI是一种设计模式
所以两者有本质上的区别。DI是IOC的一种实现方法(还有ServiceLocator等其他设计模式)。所谓的反转,主要指由主动依赖到被动依赖 。
1 | //主动依赖 |
什么是IOC容器
IOC容器 是Laravel的核心设计模式,对于laravel的应用和理解是非常有必要深入学习的!
IOC思想实现了高度解耦,那么,问题来了,如何管理这些分散的模块呢?这就是容器的任务了!
可以想象成,在IOC容器中,装着(注册)很多模块。当用户需要一个模块的时候,可以从中拿出来。当提取的模块依赖另一个模块的时候,容器会自动注入,再返回给用户(反射机制实现)。
是不是碉堡了?大批互相依赖的模块被完美解耦并统一管理了!
什么是服务提供者(ServiceProvider)
假设模块一多,那么容器不是越来越大?每次加载,岂不是加载好久? 能不能弄一条管子,连接着模块,插在容器上,需要再通过管道获取呢?这样子,容器只是装着管头而已,就不怕被撑大了!
这条管子就是 服务提供者。
服务提供者本身也是一个类,不过这个类只有启动和注册两个函数。
1 | /** |
服务提供者在config/app.php
中配置,laravel自动注册到容器中。
1 | 'providers' => [ |
什么是门面(Facade)
程序猿总是偷懒的,每次要模块,都要去容器里面拿,多麻烦啊!找个人代拿行不?这送货小哥就叫Facade门面。文档中叫静态代理。
送货小哥都是在config/app.php
中注册的。
1 | 'aliases' => [ |
查看Illuminate\Support\Facades\Route
代码,可以发现只有getAccessFacade()
方法,这就是交代送啥货的函数,继承了Facade这个小哥基类。
1 | class Route extends Facade |
注册了Facade门面后,就可以在任意地方使用了!
文档有详细的使用方式 Laravel 架构 — Facades。
Application和Kernel
不难发现,在引导程序开始初始化的时候,也就是在boostrap\app.php
文件,里面一来就new了一个 Illuminate\Foundation\Application
。下面分别注册了 Http\Kernel
、Console\Kernel
、Exceptions\Handler
等。
这里可以这么理解,new一个Application,可以看作是创造了一个空间,这个空间初始化的时候,就会为自己注入一个容器,也就是在空间中放了一个容器。
在 Illuminate\Foundation\Application.php
中的 registerBaseBindings()
函数可以查看到容器注入源码。
至于kernel,可以看成是这个空间的工人,有各种各样的工人,每个工人都有自己的工作。好比HttpKernel,负责处理http请求以及控制整个请求流程。
总结
讲到这里就差不多分享完了,以上是只是个人理解,欢迎提出里面理解不妥当的地方!