通过分解Response类了解如何向浏览器发送数据。
头部声明
namespace Illuminate\Http;
use ArrayObject;
use JsonSerializable;
use Illuminate\Support\Traits\Macroable;
use Illuminate\Contracts\Support\Jsonable;
use Illuminate\Contracts\Support\Arrayable;
use Illuminate\Contracts\Support\Renderable;
use Symfony\Component\HttpFoundation\Response as BaseResponse;
class Response extends BaseResponse
{
use ResponseTrait, Macroable {
Macroable::__call as macroCall;
}
}
构造函数
public function __construct($content = '', int $status = 200, array $headers = [])
{
$this->headers = new ResponseHeaderBag($headers);
// "设置内容到$content成员中"
$this->setContent($content);
// "设置statusCode,如果<100 || >=600 则抛异常,否则设置头部信息"
$this->setStatusCode($status);
// "设置HTTP协议版本号"
$this->setProtocolVersion('1.0');
}
核型方法解析
• 继承自Symfony中的方法
public function send()
{
// "返回header信息"
$this->sendHeaders();
// "echo $this->content;"
$this->sendContent();
if (\function_exists('fastcgi_finish_request')) {
// "刷新所有数据到客户端,同时结束请求."
fastcgi_finish_request();
} elseif (!\in_array(\PHP_SAPI, ['cli', 'phpdbg'], true)) {
// "不存在fastcgi_finish_request()方法执行"
static::closeOutputBuffers(0, true);
}
return $this;
}
public static function closeOutputBuffers(int $targetLevel, bool $flush)
{
$status = ob_get_status(true);
$level = \count($status);
$flags = PHP_OUTPUT_HANDLER_REMOVABLE | ($flush ? PHP_OUTPUT_HANDLER_FLUSHABLE : PHP_OUTPUT_HANDLER_CLEANABLE);
while ($level-- > $targetLevel && ($s = $status[$level]) && (!isset($s['del']) ? !isset($s['flags']) || ($s['flags'] & $flags) === $flags : $s['del'])) {
if ($flush) {
ob_end_flush();
} else {
ob_end_clean();
}
}
}
总结
执行完成send()方法之后fastcgi处理完成当前的请求,
并将缓冲区的数据以及头部信息输出到浏览器。
到此响应输出完成。
关于框架如何在启动的过程中构造出来Response对象在后面的章节会详细讲解,
当前是属于分解Response类来了解里面都实现了什么功能。