Laravel 请求生命周期

这是一篇翻译文章,原文 Request Life Cycle of Laravel,译文 Laravel 请求生命周期 首发于个人博客,转载请注明出处。

当需要使用一个框架、工具或者服务时,在使用前应对其运行原理进行研究。随着原理研究工作的不断深入,能让我们在使用时更得心应手。

这篇文章旨在帮助大家掌握 「Laravel HTTP 请求生命周期」 的工作原理。内容涵盖当一个 HTTP 请求发送到 Laravel 服务后,这个请求在项目运行的各个阶段是如何被处理的,然后框架又是如何将处理结果发送回用户的。

我们会带领大家一步步深入挖掘出这其中的秘密。

自动加载

第一步,当用户在浏览器访问 URL 时会发起一个 HTTP 请求,最终这个请求被发送到我们的 Web 服务器。Web 服务器(Apache 或 Nginx) 通过匹配的服务配置,再将请求发送到 Laravel 中的 入口文件 public/index.php,该文件完成项目依赖服务的加载功能。首先它将 composer 生成的自动加载器引入项目(译注:require DIR.'/../vendor/autoload.php';)。

然后接收由 bootstrap/app.php 文件创建的应用实例。创建实例的过程即是项目初始化的过程。

内核

下一步:我们将焦点锁定到应用实例的内核部分。

应用实例根据 HTTP 请求的运行环境,来决定将请求发送到 HTTP 内核或 Console 内核。这两个内核是所有 HTTP 请求的集散中心。

HTTP 内核是定义在 app/Http/Kernel.php 文件内的 Kernel 实现类,它接收一个请求,然后返回一个响应,就是这么简单。不过,在 Kernel 类的内部有定义诸多的 引导程序(Bootstrappers),这些引导程序会完成错误句柄(handle)配置、日志配置、运行环境识别和所有需要在请求被执行前完成的配置工作。

不仅如此,Kernel 类还定义了许多需要在请求被处理前需要被执行的中间件。

服务提供者

接下来,内核会在引导项目启动时加载服务提供者。应用实例所依赖的服务提供者可以在 config/app.php 配置文件中的 providers 节点找到。

一个服务提供者的 register() 方法被调用时,这个服务提供者即被注册到应用实例。完成所有服务提供者注册到应用实例后,应用实例执行启动方法(boot method)引导项目启动。

分发请求

随着应用实例完成引导、注册服务器提供者和启动等处理,接下来请求便会被路由器(Router)转发。路由器将请求转发至注册的路由和对应的控制器(译注:在 routes/web.php 或 routes/api.php 文件中定义的路由),并且执行当前路由相关的中间件。

路由器

现在到了请求被处理和渲染的环节:

Router will direct the HTTP Request to a Controller or return a view or responses directly by omitting the controller. These routes will be placed in app/routes.php.

路由器把 HTTP 请求发送到匹配的控制器或视图。我们可以在 routes/web.php 中(译注:原文定义在 app/routes.php 中,仅适用于 Laravel 5.3 之前)定义路由。

项目所有的控制器都管理在 app/Https/Controllers(译注:原文 app/controllers) 目录中,一个控制器对应一个操作,并发送数据到其视图。

视图文件被定义在 resources/views 目录中,功能是输出数据并响应 HTTP 请求。

下面的执行流程图详细描述了上述步骤的执行过程:

HTTP 请求生命周期

一个 HTTP 请求实例

1

用户在浏览器输入 http://xyz.com 并点击回车按钮。

2

当用户点击回车按钮,浏览器将页面的请求通过网络发送到 Web 服务器。

3

Web 服务器接收请求并解析请求信息。在 Web 服务器的配置文件中有配置当前项目根目录路径。由于当前访问的 URL 地址不包含子路径,Web 服务器会查找配置文件的 index.php 文件。

4

Web 服务器将请求发送到项目的 public/index.php 文件。

5

PHP 解释器接收到请求后,解释执行 index.php 文件中的 PHP 代码。此时,由 Componser 包管理器生成的自动加载文件被加载。

6

之后,Laravel 应用实例被实例化,同时,引导安装 laravel 组件。

7

HTTP 或 Console 内核接收到 HTTP 请求,加载 Laravel 服务提供者,同时,将请求分发给路由器执行。

8

路由器将渲染视图文件,并生成响应数据给 Web 服务器。

9

Web 服务器接收到 PHP 的输出结果,并将结果返回给用户浏览器。

10

用户浏览器接收到服务器响应,渲染页面并展现给用户。

总结

通过理解 Laravel 请求生命周期,不仅能够增加开发 Laravel 项目的自信心。还有助于调试项目、定位和解决 bug。在某些场景下可以快加快速的更总问题。

原文:Request Life Cycle of Laravel

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 3年前 自动加精
liuqing_hu
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!