Laravel 是如何请求 Request 的

507 阅读1分钟

1、从入口文件开始分析

Laravel 的入口文件是 /public/index.php。在 index.php 中,处理请求的代码是:

$response = $kernel->handle(
    $request = Illuminate\Http\Request::capture()
);

这里,$kernel 是上面绑定到服务容器中的Kernel 实现实例,也就是 App\Http\Kernel::class。

2、分析 $kernel 调用的 handle () 方法

它调用了 handle () 方法,在 App\Http\Kernel.php 中并没有 handle () 方法,因此它调用的其实是它的父类中的 handle 方法。

它的父类 handle () 方法是这样:

public function handle($request)
{
    try {
        $request->enableHttpMethodParameterOverride();
        $response = $this->sendRequestThroughRouter($request);
    } catch (Exception $e) {
      ...
    } catch (Throwable $e) {
       ...
    }
    ...
    return $response;
}

很轻易的看到,这个方法的作用就是 传入请求,返回响应。

我们看到,这个方法其实接收了一个

request ,那么这个

request,那么这个request 就是调用方 index.php 传过来的。

3、分析 $request 的来源

index.php 传过来的

request:

request:request = Illuminate\Http\Request::capture()
capture () 方法是这样的:

public static function capture()
{
    // 启用对方法请求参数的支持
    static::enableHttpMethodParameterOverride();
    // 将请求数据赋值给 创建的 Request 对象实例,并返回
    return static::createFromBase(
        SymfonyRequest::createFromGlobals()
    );
}

4、再次回到 index.php

$response = $kernel->handle(
    $request = Illuminate\Http\Request::capture()
);

$request 对象获取到了,这个对象包含了所有的请求参数,比如请求数据、请求方式、请求 URL、请求头、用户 IP、是否使用 HTTPS 等。

然后,index.php 中的

kernel(处理 HTTP 请求的核心类)就拿着这个请求实例

kernel(处理HTTP请求的核心类)就拿着这个请求实例request 去 handle (),然后得到响应。