当我们在使用框架、工具或者一项服务的时候,详细了解它是「如何工作」的,会让我们用起来更加得心应手。

这篇文章帮助大家了解 Laravel 的「请求生命周期」,也就是 Laravel 是如何处理不同阶段的请求然后将对应的响应返回给用户。我们将一步步深入每个阶段,来更好的理解。

1. 自动加载

首先,用户浏览器会发起一个请求,然后到达服务器。服务器(Apache 或 Nginx)会把收到的请求重定向到 Laravel 项目下的 public/index.php 文件,该文件是整个框架的入口文件。它会加载由 Composer 生成的自动加载文件。

然后 bootstrap/app.php 得到一个 Laravel 应用实例,Laravel 自身创建一个应用实例,这就是第一步。

2. 内核

接下来就是应用的内核部分。

根据应用的请求类型,该请求被发送给「HTTP 内核」或「Console 内核」,这两个是所有请求经过的中心点。

HTTP 内核位于 app/Http/Kernel.php。它只是收到一个请求然后返回一个响应。内核中定义了引导任务,包括配置错误处理,配置日志,检测环境以及请求处理前需要进行的其它任务。

HTTP 内核中还会定义请求被应用处理前需要经过的「中间件」列表。

3. 服务提供器

作为引导的一部分,下一步内核将会加载服务提供器。应用所需要的服务提供器都位于配置文件 config/app.php 中。

当注册方法被调用时,所有的服务提供器都会被注册。一旦所有的服务提供器注册完成,接下来,boot 方法将会被调用。

4. 分发请求

当应用完成引导流程,所有的服务提供器被注册并且启动完成后,请求就会通过路由器分发出去。路由器将请求分发给路由或者控制器,此外还会运行路由具体的中间件。

5. 路由器

现在请求将会被路由器分发出去,最终到达视图:

  • 路由器将 HTTP 请求重定向到控制器,或者不使用路由器直接返回一个视图。所有路由都在 app/routes.php 中定义。
  • 位于 app/controllers/ 目录下的控制器执行具体的操作,然后把数据发送给视图。
  • 位于 app/views 目录下的视图以适当的方式展示数据,提供 HTTP 响应。

上述的所有步骤在下图中都有清晰的说明:

file

拿一个请求举例说明:

第一步:
用户在浏览器中输入 http://xyz.com,然后按下回车。

第二步:
浏览器通过互联网将页面请求发送给服务器。

第三步:
服务器收到请求并分析请求信息。

第四步:
服务器将请求重定向到 Laravel 应用的 public/index.php 文件。

第五步:
PHP 解释器执行请求中包含的 index.php 中的代码。过程中,Composer 生成的自动加载文件将会被加载。

第六步:
创建 Laravel 应用实例,引导启动组件。

第七步:
内核收到请求,加载服务提供器,将请求重定向到路由器。

第八步:
路由器渲染视图文件内容,并返回给服务器。

第九步:
服务器收到来自 PHP 的输出,并将其通过互联网返回给用户浏览器。

第十步:
用户浏览器收到服务器的响应,并将其呈现到电脑上。

6. 总结

通过理解请求生命周期的整个流程,我们在开发一个应用的时候会更有信心。也会提供我们更快的调试 bug 的能力。在一些不可预期的情况下,我们也能更容易的定位到问题。

原文链接