照猫画虎 实现 min-laravel 框架系列之 http 请求

php   laravel  

http 请求处理过程

在 bootstrap/app.php 中注册实现关系

  1. $app->singleton(
  2. Illuminate\Contracts\Http\Kernel::class,
  3. App\Http\Kernel::class
  4. );

处理请求并且返回影响

在 index.php 文件中,解析 kernel 类,并且调用 handle 方法,处理客户端发送过来的请求

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

Request 请求类

laravel 框架的 request 请求部分使用了 symfony 提供的 HttpFoundation 组件,该组件针对 http 协议定义了一个面向对象层,不了解的请自行 Google。

添加依赖包

  • 在 minlaravelframework/framework 的 composer.json 配置文件中添加依赖包

    1. "require": {
    2. "symfony/http-foundation": "^5.0"
    3. },
  • 在 minlaravel 目录下更新, composer update

capture 方法

整理每次 http 请求的参数,包括 cookie 、headers 等

Kernel 内核类

此类就是 laravel 框架接受 http 请求,寻找对应路由,处理并返回响应的核心类

sendRequestThroughRouter 方法

这个方法,利用管道模式,将请求一次通过各种中间件处理,最终达到处理该请求的控制器,最后生成响应返回给客户端。

这里,我们重点关注一下 bootstrap 方法

  1. protected function sendRequestThroughRouter($request)
  2. {
  3. $this->app->instance('request', $request);
  4. Facade::clearResolvedInstance('request');
  5. $this->bootstrap();
  6. return (new Pipeline($this->app))
  7. ->send($request)
  8. ->through($this->app->shouldSkipMiddleware() ? [] : $this->middleware)
  9. ->then($this->dispatchToRouter());
  10. }

bootstrap 方法

这个方法的主要作用就是注册一些处理 http 请求所必须的服务,

  1. public function bootstrap()
  2. {
  3. if (! $this->app->hasBeenBootstrapped()) {
  4. $this->app->bootstrapWith($this->bootstrappers());
  5. }
  6. }

其中,启动的服务包括 env 配置加载、config 配置加载,面板服务等

  1. protected $bootstrappers = [
  2. \Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables::class,
  3. \Illuminate\Foundation\Bootstrap\LoadConfiguration::class,
  4. \Illuminate\Foundation\Bootstrap\HandleExceptions::class,
  5. \Illuminate\Foundation\Bootstrap\RegisterFacades::class,
  6. \Illuminate\Foundation\Bootstrap\RegisterProviders::class,
  7. \Illuminate\Foundation\Bootstrap\BootProviders::class,
  8. ];

说明

为了一步步分析路由寻址的过程,接下来会先讲一下上述几个服务的实现过程



评论 0

发表评论

Top