当我们在使用框架、工具或者一项服务的时候,详细了解它是「如何工作」的,会让我们用起来更加得心应手。
这篇文章帮助大家了解 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 响应。
上述的所有步骤在下图中都有清晰的说明:
拿一个请求举例说明:
第一步:
用户在浏览器中输入 http://xyz.com
,然后按下回车。
第二步:
浏览器通过互联网将页面请求发送给服务器。
第三步:
服务器收到请求并分析请求信息。
第四步:
服务器将请求重定向到 Laravel 应用的 public/index.php
文件。
第五步:
PHP 解释器执行请求中包含的 index.php
中的代码。过程中,Composer 生成的自动加载文件将会被加载。
第六步:
创建 Laravel 应用实例,引导启动组件。
第七步:
内核收到请求,加载服务提供器,将请求重定向到路由器。
第八步:
路由器渲染视图文件内容,并返回给服务器。
第九步:
服务器收到来自 PHP 的输出,并将其通过互联网返回给用户浏览器。
第十步:
用户浏览器收到服务器的响应,并将其呈现到电脑上。
6. 总结
通过理解请求生命周期的整个流程,我们在开发一个应用的时候会更有信心。也会提供我们更快的调试 bug 的能力。在一些不可预期的情况下,我们也能更容易的定位到问题。