思考并回答以下问题:
IoC容器和服务提供者
上一节我们的代码还是没有完全达到解耦,假如我们项目里有很多功能用到了这个login功能,我们则在这几个页面反复写。但是突然我们有一天换需求了,觉得数据库记录日志不太好,想要改成文件的,那我们不是每个页面用到login功能的都去替换成new FileLog()吗?那该如何修改呢?
我们可以借助一个容器,提前把log,user都绑定到Ioc容器中。User的创建交给这个容器去做。比如下面这样的,你在任何地方使用login,都不需要关心是用什么记录日志了,哪怕后期需要修改只需要在IoC容器修改绑定其他记录方式日志就行了。
具体代码实现的思路
- 1、Ioc容器维护binding数组记录bind方法传入的键值对如:log=>FileLog,user=>User。
- 2、在ioc->make(‘user’)的时候,通过反射拿到User的构造函数,拿到构造函数的参数,发现参数是User的构造函数参数log,然后根据log得到FileLog。
- 3、这时候我们只需要通过反射机制创建$filelog = new FileLog();
- 4、通过newInstanceArgs然后再去创建new User($filelog);
1 | // 实例化ioc容器 |
这里的容器就是指Ioc容器,服务提供者就是User。
上一节遗留一个问题,如果参数是接口该怎么处理,其实就是通过IoC容器提前绑定好。
核心IoC容器代码编写
1 | interface log |
至此,我们的IoC就已经实现了。
Laravel中的服务容器和服务提供者
1 | $providers = [ |
可以在config目录找到app.php中providers,这个数组定义的都是已经写好的服务提供者。
具体服务提供者register方法是什么时候执行的,我们到讲Laravel生命周期的时候再详细说。