请求周期
请求周期
引言
在 “现实世界” 中使用任何工具时,如果你了解该工具的工作原理,你会更有信心。应用开发也不例外。 当你了解你的开发工具如何工作时,你会更加舒适和自信地使用它们。
本文档的目的是为你提供一个关于 Laravel 框架如何工作的良好、高层次的概述。通过更好地了解整个框架,你会觉得一切都不再那么 “神奇”,并且在构建你的应用程序时会更加自信。如果你不是立即理解所有的术语,也不要灰心!只要尝试对正在发生的事情有一个基本的了解,随着你探索文档的其他部分,你的知识会不断增长。
生命周期概述
首先
Laravel 应用程序中所有请求的入口点是public/index.php
文件。 你的 web 服务器(Apache / Nginx)配置将所有请求都指向这个文件。index.php
文件没有包含太多代码。相反,它是加载框架其余部分的起点。
index.php
文件加载了 Composer 生成的自动加载器定义,然后从bootstrap/app.php
中获取 Laravel 应用程序的实例。 Laravel 本身采取的第一个行动是创建应用程序的实例/服务容器.
HTTP / Console 内核
接下来,传入的请求会根据进入应用的请求类型,通过应用实例的 handleRequest
或 handleCommand
方法,被发送到 HTTP 内核或者 Console 内核。这两个内核是所有请求流经的中心位置。现在,让我们专注于 HTTP 内核,它是 Illuminate\Foundation\Http\Kernel
的一个实例。
HTTP 内核定义了一个将在执行请求之前运行的 bootstrappers
数组。 这些引导程序用来配置异常处理、配置日志、 检测应用程序环境 ,以及执行其他在实际处理请求前需要完成的任务。通常情况下,这些类处理的是 Laravel 内部配置,你无需担心。
HTTP 内核还定义了一个 HTTP 中间件列表,所有请求在被应用程序处理之前都必须通过该列表。这些中间件处理读写 HTTP session ,确定应用程序是否处于维护模式, 校验 CSRF 令牌 ,等等。我们接下来会做详细的讨论。
HTTP 内核的 handle
方法的签名非常简单:它接收 Request
接口并返回 Response
接口。把内核想象成一个代表整个应用程序的大黑匣子。向它提供 HTTP 请求,它将返回 HTTP 响应。
服务提供者
最重要的内核引导操作之一是为应用程序加载 服务提供者 。 服务提供者负责引导框架的所有不同组件,例如数据库、队列、验证和路由组件。
Laravel 将遍历这个提供者列表并实例化它们中的每一个。 实例化提供程序后,将在所有提供程序上调用 register
方法。然后,一旦所有的提供者都被注册了,就会对每个提供程序调用 boot
方法。服务提供者可能依赖于在执行 boot
方法时注册并可用的每个容器绑定。
Laravel 提供的每个主要功能本质上都是由服务提供者引导和配置。因为它们引导和配置了框架提供的如此多的功能,所以服务提供者是整个 Laravel 引导过程中最重要的方面。
虽然框架内部使用了数十个服务提供者,但你也可以选择创建自己的服务提供者。 你可以在 bootstrap/providers.php
文件中找到你的应用程序正在使用的用户定义或第三方服务提供者列表。
路由
一旦应用程序完成引导并且所有服务提供者都已注册, Request
将被传递给路由器进行调度。路由器将请求分发到路由或控制器,并运行任何特定于路由的中间件。
中间件为过滤或检查进入应用程序的 HTTP 请求提供了一种便捷的机制。例如,Laravel 包含一个验证应用程序用户是否已认证的中间件。如果用户未认证,中间件将把用户重定向到登录界面。但是,如果用户经过身份验证,中间件将允许请求进一步进入应用程序。 一些中间件被分配给应用程序中的所有路由,如 PreventRequestsDuringMaintenance
,而一些中间件只被分配给特定路由或路由组。你可以通过阅读完整的中间件文档来了解更多关于中间件的信息。
如果请求通过了所有匹配路由分配的中间件,则执行路由或控制器方法,并通过路由的中间件链路返回路由或控制器方法的响应。
收尾
一旦路由或控制器方法返回一个响应,该响应将通过路由的中间件返回,从而使应用程序有机会修改或检查传出的响应。
最后,一旦响应通过中间件返回,HTTP 内核的handle
方法将响应对象返回给应用程序实例的 handleRequest
,该方法在返回的响应上调用send
方法。send
方法返回响应内容给用户的web浏览器。至此,我们已经完成了整个Laravel请求生命周期的旅程!
关注服务提供者
服务提供者确实是引导 Laravel 应用程序的关键。创建应用程序实例,注册服务提供者,并将请求传递给应用程序。就这么简单!
牢牢掌握服务提供者的构建和其对 Laravel 应用处理机制的原理是非常有价值的。 应用程序的自定义服务提供者会存放在app/Providers
目录下面。
AppServiceProvider
默认是空白的。 这里是用于你添加应用自身的引导处理和服务容器绑定的一个非常棒的地方。在大型项目中,你可能希望创建多个服务提供者,每个服务提供者都为应用程序使用的特定服务提供更细粒度的引导。
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
推荐文章: