- 服务器容器
- 服务器提供者
- 门脸模式
服务器容器
容器概念 就是装东西的,容器装的是一个一个实例的对象(类),换句话说也是一个服务
往容器放进邮件类,就是一个绑定的过程,在绑定之后我们需要在获取的时候,从容器后去到这个类,这叫做处理或者解析的过程
我们为什么要使用容器,我们使用容器来做什么呢
答: IOC控制反转 面相对向思想,降低代码的耦合度
没有用到IOC控制反转,对象A依赖对象B,对现象A初始化或者运行某一点的时候,必须自己主动去new,创建或者使用已经创建的对象B,不管创建还是使用对象B,控制权都在自己的手上
有个IOC的容器,对象B在初始化,往IOC注入一个标识,字符串B表示对象B,在A想要一定程度的时候,需要对象B的时候,并不是初始化对象B,而是往IOC容器中取出对象B,这样就跟对象A和对象B解耦了,解耦的方式就是用IOC容器的字符串B,比如这个时候对象B换成了对象D,在IOC容器中把字符串B对应的对象B改成对象D,A的程序不需要任何的修改就可以直接使用了 —这就是控制反转的思想
IOC控制反转经常结合依赖注入来做
DI依赖注入 就是将实例当做变量传入到对象当中去,laravel依赖注入是用反射来完成的,比如在用register类的时候,我们在controler函数中,我们并不需要,显示的使用register,我们只需要register作为参数就可以获取register对象了,这个传递过来的对象是依赖容器中注入的是什么
laravel的容器在那里呢
使用类名作为字符串的
这就是容器和绑定的过程
这就是解释容器和IOC控制反转
现在说下 依赖注入
如果在参数中,我们要使用请求(request之外我在一个$log(类)
我们只要往函数参数中加入一个类,它自然往这个类里面注入一个实例,这就是依赖注入
问:绑定是谁来做
答:服务提供注册,一个服务提供者一旦注册了,它就提供一个服务了,这个服务继承了ServiceProvider
两个方法:
register是代表所有的提提供服务者提供服务之前,进行注册的
boot 是在所有服务提供者加载之后进行注册的
他们是顺序的区别
我们可在一个请求生命周期开始之前,我们就提供这个服务,就是说把这个服务放在容器中,也可以具体使用到的时候,第一次使用到的时候,我们才对这个服务进行提供
标志代表,你是在什么时间点往容器中增加这个服务
路径: laravel58\config\app.php
一个请求生命周期中,有的在框架写的注册服务提供,还有一个是在配置文件中写的服务提供
三、门脸模式
平时使用的类,需要new,或者从容器中获取,但是门脸模式为容器中可用的类提供一个静态调用的方法,我们可以静态调用容器的对应类,
比如:
路径: laravel58\config\app.php下的 aliases
E:\xampp\htdocs\xampp\laravel58\vendor\laravel\framework\src\Illuminate\Support\Facades\Request.php
门脸类只有一个函数 ,这个函数做了什么事情呢,return了一个字符串,这个字符串是什么?就是我们上面说的容器中类的对应的标签(标识)
class Request extends Facade
{
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor()
{
return 'request';
}
}
就是下面的图片
一、用这个函数可用获取到容器
public function test() {
// return '我是认证访问';
#用这个函数可用获取到容器
$app = app();
#从容器中获取日志类 make中的字符串用什么呢,找到日志类在什么地方注册的,注册的字符串是什么就是绑定的过程需要找到的
$log =$app->make("log");
dd($log);
# $log->info("post_index",['data' => 'this is post index']);
}
#容器的地址 E:\xampp\htdocs\xampp\laravel58\bootstrap\app.php
绑定的过程就是在容器里面
E:\xampp\htdocs\xampp\laravel58\vendor\laravel\framework\src\Illuminate\Foundation\Application.php日志类
E:\xampp\htdocs\xampp\laravel58\vendor\laravel\framework\src\Illuminate\Log\LogServiceProvider.php
#这个日志服务提供者在register方法里面,使用singleton的方法,来把一个日志类也叫做日志服务,绑定到容器中,绑定的字符串叫做log
二、我不想从容器中获取 ,我们想直接使用依赖注入
找到这个方法
E:\xampp\htdocs\xampp\laravel58\vendor\laravel\framework\src\Illuminate\Foundation\Application.php
上图
Aliases的意思是
服务容器中注册的名字是log,但是我可以使用这三个类,相当于获取的是log服务容器中的类
public function test(\Psr\Log\LoggerInterface $log) {
// return '我是认证访问';
dd($log);
#我不想从容器中获取 ,我们想直接使用依赖注入
#用这个函数可用获取到容器
// $app = app();
// #从容器中获取日志类 make中的字符串用什么呢,找到日志类在什么地方注册的,注册的字符串是什么就是绑定的过程需要找到
// $log =$app->make("log");
// dd($log);
// $log->info("post_index",['data' => 'this is post index']);
}
依赖注入成功
三、用门脸怎么查
如何查找一个门脸或注入类又哪些函数
最重要的是查找到你在容器中,注册的字符串
你是门脸类你要找字符串怎么找呢
路径是:E:\xampp\htdocs\xampp\laravel58\vendor\laravel\framework\src\Illuminate\Support\Facades\Log.php
查找门脸类对应的容器的字符串是什么,可以看到这个log对应它在容器中对应的字符串是 return LoggerInterface::class;
Psr\Log\LoggerInterface 对应的是在容器中的实际是log
#看api文档
https://laravel.com/api/5.4/Illuminate/Log/Writer.html