laravel容器是什么时候绑定服务提供者里面register的

2018-04-28  本文已影响44人  WellKnownBooks

一直对服务提供者的原理也不会很明白了,今天特意去找了一下laravel在那里绑定服务提供者所提供的服务。

首先我们都知道laravel是单入口框架。那么一切的开始都是从index.php开始的。

index.php

好多小伙伴就不理解了,为什么要在处理请求的时候才开始绑定配置中的服务提供者提供的服务呢。这里我猜测是为了,减轻框架的开支,就比如说一个请求就不没有通过路由器,那就没有必要去加载很多的服务,直接返回就可以了,这样,优化了框架的开支。

不信的小伙伴可以继续往下看。

我们进入生成$app的文件看一下

bootstrap/app.php

很明显我们的框架只是加载了基本的三个服务。

用来处理错误的服务。

任务调度的服务。

处理http  请求的服务。

那我们在配置文件里面配置的服务提供者的服务是在那里绑定的呢?

我们开始去看index.php里面的这句话。

$response = $kernel->handle(

    $request = Illuminate\Http\Request::capture()

);

寓意很简单,就是开始处理请求,并生成返回。

那么我们看一下http服务这个kernel里面的handle()方法。

Http/Kernel.php里面只是一些配置的中间件,没有什么可说的,那么我们进去这个类的父类。

\Illuminate\Foundation\Http\Kernel

注意这里的$bootstrappers的数组里面的\Illuminate\Foundation\Bootstrap\RegisterProviders::class,

元素,我们一会要提到他。

还是继续上面的handle()方法。

handle()方法

那我们看上图标红框的方法

sendRequestThroughRouter()方法

看!这里有一个bootstrap()方法。

继续跟。

bootstrap()方法

这里的bootstrapWith()方法里面的参数就是拿的我们这个数组

$bootstrappers

$this->app->bootstrapWith($this->bootstrappers());

这里的$this->app就是全局服务容器嘛,所以就去看\Illuminate\Foundation\Application这个文件喽。

bootstrapWith()方法

所以我们看到了这里我们会把

\Illuminate\Foundation\Bootstrap\RegisterProviders::class,这个服务解释出来,那么就去看这个文件喽

bootstrap

那就继续看registerConfiguredProviders()

registerConfiguredProviders()方法

好了,我们终于看到了app.providers这个字符串了。

谢谢大家

上一篇下一篇

猜你喜欢

热点阅读