laravel底层中,第一个使用make函数的地方
laravel 中make函数,就是类似于实例化,只不过laravel用了依赖注入,提前将一些类注入到容器中,然后直接用make函数去调用,其中,application类中定义的binding,instance,bindings都存放着类。
在$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);中,要看他的make方法,首先就要看他在哪将Illuminate\Contracts\Http\Kernel注入到容器中,在boostrap的app.php中可以找到
那接下来就去看一下,他的singleton()是如何走的流程。
接着我们去看bind()
其中在判断$concrete是否是闭包的时候,由于传入的是App\Http\Kernel这个类名,所以不是闭包,接下来,就生成一个闭包
图中可以看到,返回的是一个闭包函数。
接着我们就回到make中,application 中的make
下面的方法就不介绍了,自己去看一下,最后会发现他执行的是父类中的make
然后我们去父类中找
接着看resolve
当执行到$concrete = $this->getConcrete($abstract);中,
由于前面介绍了
在他的绑定中,有绑定过一个闭包函数。因此直接执行第二个if判断语句
思绪回到这个方法中,那得到的$concrete是一个闭包函数,接着就开始下面的判断,看一下isBuildable()这个方法。
看到这边有一个判断,$concrete是否是一个闭包函数,前面解释了他就是一个闭包,因此返回true
那我们就执行buid()
箭头所指的就是接下去要执行的地方,由于$concrete他是一个闭包,接下来回顾一下这个闭包。
前面bind的时候,$abstract=‘’Illuminate\Contracts\Http\Kernel $concrete=‘App\Http\Kernel’
$container=$this,也就是application $parameters=$this->getLastParameterOverride()
由于两个不相等,结果有执行一遍make(),而此时的make中带的参数,就是‘App\Http\Kernel’和$parameters。接着就按着前面介绍的make执行的思路走一遍,最后会发现,他实例化的就是App\Http\Kernel这个类,由于他继承了,HttpKernel这个类,因此也有了handle()这个方法。
所以$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);去看的不是Illuminate\Contracts\Http\Kernel:这个类,而是App\Http\Kernel这个类,这也是为什么不仔细去看一下他的绑定,直接去找Illuminate\Contracts\Http\Kernel,会发现他是一个接口类,而且对handle()这个方法只是定义。最后一脸懵逼
网友评论