Laravel 请求 Request 剖析

  • 2020-02-29
  • 51

1、从入口文件开始分析

Laravel的入口文件是 /public/index.php。

在index.php 中,处理请求的代码是:

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

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

 

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

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

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

  1. public function handle($request)
  2. {
  3. try {
  4. $request->enableHttpMethodParameterOverride();
  5. $response = $this->sendRequestThroughRouter($request);
  6. } catch (Exception $e) {
  7. ...
  8. } catch (Throwable $e) {
  9. ...
  10. }
  11. ...
  12. return $response;
  13. }

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

我们看到,这个方法其实接收了一个 $request ,那么这个 $request 就是调用方 index.php 传过来的。

 

3、分析 $request 的来源

index.php 传过来的 $request:

  1. $request = Illuminate\Http\Request::capture()

capture() 方法是这样的:

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

 

4、再次回到 index.php

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

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

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

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

 

 



Top