通过分解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);
$this->setContent($content); // 设置内容到$content成员中
$this->setStatusCode($status); //设置statusCode,如果<100 || >=600 则抛异常,否则设置头部信息
$this->setProtocolVersion('1.0'); // 设置HTTP协议版本号
}
复制代码
核型方法解析
• 继承自Symfony中的方法
public function send()
{
$this->sendHeaders(); // 返回header信息
$this->sendContent(); // echo $this->content;
if (\function_exists('fastcgi_finish_request')) {
fastcgi_finish_request(); // 刷新所有数据到客户端,同时结束请求.
} elseif (!\in_array(\PHP_SAPI, ['cli', 'phpdbg'], true)) {
static::closeOutputBuffers(0, true); // 不存在fastcgi_finish_request()方法执行
}
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类 来了解里面都实现了什么功能。