Laravel 请求 Request 剖析

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 就是调用方 index.php 传过来的。

 

3、分析 $request 的来源

index.php 传过来的 $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请求的核心类)就拿着这个请求实例 $request 去 handle(),然后得到响应。

具体 handle() 中是如何处理响应的,下一篇 Laravel 响应类 Response 剖析 分析