关于laravel make踩的坑

2019-03-07  本文已影响0人  youngxs

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()这个方法只是定义。最后一脸懵逼

上一篇下一篇

猜你喜欢

热点阅读