laravel的response()函数中,输入array却响应json的原因
php中不能直接写{"key":"value"}
的形式,必须将string|array
用json_encode()
等函数进行转换,才能变为json
对象。
但是我发现response
函数的$content
参数主要输入的是array
类型,用postman
得到的输出结果却是标准的json
格式。
这不用想,肯定是自动解析成json后才响应给客户端的啊,但作为程序员一定要有分析源码的本事,哪怕显而易见response()
函数肯定得去查看Response
类,但这也太没有挑战性了,于是我立意要换一种方法去探索并找出把$content
值转换为json
对象的方法。
线路一:
第一步当然是对着response
单词,按住ctrl
+鼠标左键,于是进入到了下面的函数体:$content
被传递到了make()
中,但点击make
死活也无法跳转。
那怎么办才能找到make()
函数属于哪个类实例的?$factory
实例中应该有这个方法?
尝试跳转至app
,
它返回的是Application
类,继续跳转至该类:
发现他是个静态方法,此路不通!
线路二:
能注意到,返回的是Container::getInstance()
实例的一个方法:
我探索了一段时间,啥都没捞着,这条路算了吧。
线路三:
$content
参数的类型能知道,
于是我尝试在根目录下进行了一系列全局搜索:$context
有点多,但肯定是请求或响应相关的,于是我对这些结果进行了一番寻找,找到了如下:
这里的参数是不是和response()
函数的参数一样?我猜应该就是它了!
于是跳转至setContext()
,
显而易见,将array
解析成json
的函数在这里。
线路四:
make()
函数的返回值是一个Response
类型实例,但是Response
类并没有make()
函数,
我们再来看一下,make()
函数是被$factory
调用的,我们再跳转至ResponseFactory
看一下,
于是发现了:$factory
的make()
方法即创建一个Response类实例,创建实例就的需要构造函数,
于是:
对上号了!
本作品采用《CC 协议》,转载必须注明作者和本文链接