照猫画虎 实现 min-laravel 框架系列之 http 请求
- laravel
- 2020-06-08
- 2915
- 0
http 请求处理过程
在 bootstrap/app.php 中注册实现关系
$app->singleton(
Illuminate\Contracts\Http\Kernel::class,
App\Http\Kernel::class
);
处理请求并且返回影响
在 index.php 文件中,解析 kernel 类,并且调用 handle 方法,处理客户端发送过来的请求
$response = $kernel->handle(
$request = Illuminate\Http\Request::capture()
);
Request 请求类
laravel 框架的 request 请求部分使用了 symfony 提供的 HttpFoundation 组件,该组件针对 http 协议定义了一个面向对象层,不了解的请自行 Google。
添加依赖包
在 minlaravelframework/framework 的 composer.json 配置文件中添加依赖包
"require": {
"symfony/http-foundation": "^5.0"
},
在 minlaravel 目录下更新, composer update
capture 方法
整理每次 http 请求的参数,包括 cookie 、headers 等
Kernel 内核类
此类就是 laravel 框架接受 http 请求,寻找对应路由,处理并返回响应的核心类
sendRequestThroughRouter 方法
这个方法,利用管道模式,将请求一次通过各种中间件处理,最终达到处理该请求的控制器,最后生成响应返回给客户端。
这里,我们重点关注一下 bootstrap 方法
protected function sendRequestThroughRouter($request)
{
$this->app->instance('request', $request);
Facade::clearResolvedInstance('request');
$this->bootstrap();
return (new Pipeline($this->app))
->send($request)
->through($this->app->shouldSkipMiddleware() ? [] : $this->middleware)
->then($this->dispatchToRouter());
}
bootstrap 方法
这个方法的主要作用就是注册一些处理 http 请求所必须的服务,
public function bootstrap()
{
if (! $this->app->hasBeenBootstrapped()) {
$this->app->bootstrapWith($this->bootstrappers());
}
}
其中,启动的服务包括 env 配置加载、config 配置加载,面板服务等
protected $bootstrappers = [
\Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables::class,
\Illuminate\Foundation\Bootstrap\LoadConfiguration::class,
\Illuminate\Foundation\Bootstrap\HandleExceptions::class,
\Illuminate\Foundation\Bootstrap\RegisterFacades::class,
\Illuminate\Foundation\Bootstrap\RegisterProviders::class,
\Illuminate\Foundation\Bootstrap\BootProviders::class,
];
说明
为了一步步分析路由寻址的过程,接下来会先讲一下上述几个服务的实现过程