Skip to content

渲染页面

php
$response = $kernel->handle(
    $request = Request::capture()
)->send();

这里只需要分析这一行代码,它将请求对象Request::capture()捕获,并将其传递给内核对象$kernel->handle(),然后将响应对象返回。 在Laravel中,Request::capture()方法会捕获当前的请求对象

send()方法

$response是类Symfony\Component\HttpFoundation\Response实例,在该类中可以找到send()方法。

php
public function send()
{
    // 发送http响应头
    $this->sendHeaders();
    // 发送http响应内容
    $this->sendContent();

    if (\function_exists('fastcgi_finish_request')) {
        fastcgi_finish_request();
    } elseif (\function_exists('litespeed_finish_request')) {
        litespeed_finish_request();
    } elseif (!\in_array(\PHP_SAPI, ['cli', 'phpdbg'], true)) {
        static::closeOutputBuffers(0, true);
        flush();
    }

    return $this;
}

sendHeaders()方法

当类Symfony\Component\HttpFoundation\Response实例化时,构造函数详细

php
public function __construct(?string $content = '', int $status = 200, array $headers = [])
{
    $this->headers = new ResponseHeaderBag($headers);
    $this->setContent($content);
    $this->setStatusCode($status);
    $this->setProtocolVersion('1.0');
}

public function sendHeaders()
{
    // headers have already been sent by the developer
    if (headers_sent()) {
        return $this;
    }

    // 这里设置返回的响应头
    foreach ($this->headers->allPreserveCaseWithoutCookies() as $name => $values) {
        $replace = 0 === strcasecmp($name, 'Content-Type');
        foreach ($values as $value) {
            header($name.': '.$value, $replace, $this->statusCode);
        }
    }

    // cookies
    foreach ($this->headers->getCookies() as $cookie) {
        header('Set-Cookie: '.$cookie, false, $this->statusCode);
    }

    // status
    header(sprintf('HTTP/%s %s %s', $this->version, $this->statusCode, $this->statusText), true, $this->statusCode);

    return $this;
}

sendContent()方法

php
public function sendContent()
{
    echo $this->content;

    return $this;
}