照猫画虎 实现 min-laravel 框架系列之 http 请求
- laravel
- 2020-06-08
- 216
- 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,];
说明
为了一步步分析路由寻址的过程,接下来会先讲一下上述几个服务的实现过程