老司机带你深入分析 Laravel 响应之 JSON
前言#
本来在上一篇博客中,我已经决定不再写关于 Laravel 源代码的文章了,但是上周六突然无缘无故被喷了一波(我也很懵逼,哪里都有这种奇葩,这都能被喷),所以这周我继续讲下去。这篇要讲的内容承接自上一篇《老死机带你深入理解 Laravel 之验证器下
》,所以如果你要阅读本篇博文,请自行阅读上一篇。
我们直接来到类 Illuminate\Routing\Router
的 runRouteWithinStack
方法(如果不清楚,所以我建议你看《老死机带你深入理解 Laravel 之验证器下
》):
$route->run()
就是我们控制器的返回结果,比如我的 DebugController
的 debug
方法如下:
当我访问这个方法时候,我们来测试一下,我们打印 $route->run()
的值,浏览器结果:
这里调用了 prepareResponse
方法,它继续调用 toResponse
方法,该方法如下:
因为在我们的控制器中,返回的是一个数组,所以我们沿着这条线索进行分析(其它情况,后面再行分析),此时的 $response
就是 Illuminate\Http\JsonResponse
类的对象,紧接着调用 prepare
方法,Illuminate\Http\JsonResponse
类继承自 Symfony\Component\HttpFoundation\JsonResponse
类,Symfony\Component\HttpFoundation\JsonResponse
类又继承自 Symfony\Component\HttpFoundation\Response
类,继承关系并不复杂,代码量也不大,自己有兴趣的可以看哈。
前面说的 prepare
方法就属于 Symfony\Component\HttpFoundation\Response
类的,我不打算分析这个方法,这个方法的作用就是设置响应的 HTTP 头部,比如:Content-Type
等。
经过了上面和之前几篇的一系列分析,我们得到了 $response
响应对象,我们回到 Laravel 的入口文件 public/index.php
文件中:
这个时候,你可以打印下 $response
的类(比如:dd(get_class($response))
):
继续分析响应对象的 send
方法,这个方法也属于 Symfony\Component\HttpFoundation\Response
类,很简单:
方法 sendHeaders
用于发送头部,如下:
方法 sendContent
用于发送响应的内容:
哈哈,就是这么简单粗暴。
send
方法调用完之后,回到 index.php
文件中:
$kernel
就是 Illuminate\Foundation\Http\Kernel
类的对象,下面进入到 terminate
方法中:
方法 terminateMiddleware
用于运行我们定义的中间件:
如果你认真的阅读过我之前写的几篇《老死机带你深入理解 Laravel 之验证器上(控制器参数解析)》和《老死机带你深入理解 Laravel 之验证器下》,就知道这段代码已经讲过了,只是要提醒你的是每一个中间件都可以实现 terminate
方法,这个方法在响应被发送给客户端之后,会被调用。
回到 terminate
方法中,调用 $this->app->terminate()
方法,app 就是 Illuminate\Foundation\Application
类的对象:
terminatingCallbacks
中的每一个元素都是一个回调,我们可以通过调用 app
的 terminate
方法添加回调。
总结#
我的天哪,终于简要的走完了 laravel 的流程,但这是远远不够的,因为我这里分析的是控制器返回的是数组类型,在后面的章节中,我会给大家分析其它的类型,包括视图,三人行,必有我师焉,可以加入 QQ 群,进行讨论:
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: