美文网首页
关于laravel make踩的坑

关于laravel make踩的坑

作者: youngxs | 来源:发表于2019-03-07 22:00 被阅读0次

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

    相关文章

      网友评论

          本文标题:关于laravel make踩的坑

          本文链接:https://www.haomeiwen.com/subject/cdjpuqtx.html