图文解说:请求与响应-Laravel 底层是如何处理 HTTP 请求的

未匹配的标注

学习链接

xueyuanjun.com/post/9804.html

流程

请求与响应-Laravel 底层是如何处理 HTTP 请求的

文字版: 下面也有。

  1. 全局中间件都校验通过才会将请求分发到路由器进行处理
  2. 路由器会将进行匹配传入request 是否已经注册
  3. 有路由,找到对应的中间件
  4. 路由中间件对请求进行过滤
  5. 运行对应的匿名函数或控制器方法,处理逻辑
  6. 响应客户端
  7. 终止kernel,终止中间件,以及注册到服务容器的一些终止回调

注意: 最后回到route 是在 response 中进行了兜底处理。
可以看下一篇文章。

看源代码

  1. 所有 HTTP 请求都会被转发到单入口文件 public/index.php
  2. 首先会创建一个 Application 实例,作为全局的服务容器
  3. 将处理请求的核心类 Kernel 实现实例绑定到该容器中
  4. 通过服务器捕获请求并将其传递给 Kernel 实例进行处理,处理结果是准备好的响应实例
  5. 调用该响应实例的 send() 方法即可将其发送给发起请求的客户端
  6. 执行 Kernel 实例上的 terminate() 终止程序,退出脚本。

核心逻辑位于 $kernel->handle() 方法调用中

核心逻辑位于 $kernel->handle()

1. 服务容器

首先 在index.php 中我们看下这段代码:

// 从服务容器中解析处理 HTTP 请求的 Kernel 实例
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

在上面的代码中,$app 对应的就是服务容器实例,并且在我们获取到该实例后就注册了 Kernel 接口及其实现类到容器中:

$app->singleton(
    Illuminate\Contracts\Http\Kernel::class,
    App\Http\Kernel::class
);

singleton 方法会以单例方式在服务容器中将 App\Http\Kernel 实例绑定到 Illuminate\Contracts\Http\Kernel 接口,后续我们要获取 App\Http\Kernel 实例,就可以通过 Illuminate\Contracts\Http\Kernel 接口从服务容器中获取,获取方法是 $app->make()

$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

2. 回到 Kernel

打开 Illuminate\Foundation\Http\KernelApp\Http\Kernel 的父类),查看 handle 方法,可以看到核心处理逻辑

  1. 通过 sendRequestThroughRouter 方法实现核心处理逻辑

  2. 在发送请求到路由之前,先调用 bootstrap() 方法运用应用的启动类

  3. 这些个启动类在路由解析之前执行,相当于对整个应用进行初始化。主要包含:加载环境变量和全局配置、配置异常处理逻辑、注册门面和服务提供者以及执行所有已注册服务提供者的 boot 方法等等。

  4. 开始真正的 HTTP 请求处理

return (new Pipeline($this->app))
            ->send($request)
            ->through($this->app->shouldSkipMiddleware() ? [] : $this->middleware)
            ->then($this->dispatchToRouter());

Laravel 框架以管道模式来处理 HTTP 请求,首先通过全局中间件对请求进行处理,如果返回 false 直接退出,不会做路由解析处理。

路由解析处理过程

  1. 全局中间件都校验通过才会将请求分发到路由器进行处理
  2. 路由器会将进行匹配传入request 是否已经注册
  3. 有路由,找到对应的中间件
  4. 路由中间件对请求进行过滤
  5. 运行对应的匿名函数或控制器方法,处理逻辑
  6. 响应客户端

3. 终止 Kernel

响应准备就绪后,就会通过 $response->send() 发送给发起请求的客户端,之后还要运行 $kernel->terminate() 做一些善后清理工作,并最终退出脚本。这些善后清理工作主要包括运行终止中间件,以及注册到服务容器的一些终止回调

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
发起讨论 只看当前版本


暂无话题~