【Laravel-海贼王系列】第六章,Response 类解析

通过分解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类 来了解里面都实现了什么功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值