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 剖析 分析