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

343 阅读1分钟

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