跳到内容

请求生命周期

简介

当在“现实世界”中使用任何工具时,如果您了解该工具的工作原理,您会感觉更有信心。应用程序开发也不例外。当您了解您的开发工具如何工作时,您会感到更加舒适和自信地使用它们。

本文档的目标是为您提供 Laravel 框架如何工作的良好、高层次的概述。通过更好地了解整个框架,一切都感觉不那么“神奇”,您将更有信心地构建您的应用程序。如果您不立即理解所有术语,请不要灰心!只需尝试基本掌握正在发生的事情,并且随着您探索文档的其他部分,您的知识将会增长。

生命周期概述

第一步

所有对 Laravel 应用程序的请求的入口点是 public/index.php 文件。所有请求都由您的 Web 服务器(Apache / Nginx)配置定向到此文件。index.php 文件不包含太多代码。相反,它是加载框架其余部分的起点。

index.php 文件加载 Composer 生成的自动加载器定义,然后从 bootstrap/app.php 中检索 Laravel 应用程序的实例。Laravel 本身采取的第一个操作是创建应用程序 / 服务容器 的实例。

HTTP / 控制台内核

接下来,传入的请求被发送到 HTTP 内核或控制台内核,具体取决于进入应用程序的请求类型,使用应用程序实例的 handleRequesthandleCommand 方法。这两个内核充当所有请求流经的中心位置。现在,让我们只关注 HTTP 内核,它是 Illuminate\Foundation\Http\Kernel 的实例。

HTTP 内核定义了一个 bootstrappers 数组,这些引导程序将在请求执行之前运行。这些引导程序配置错误处理,配置日志记录,检测应用程序环境,并执行在实际处理请求之前需要完成的其他任务。通常,这些类处理您无需担心的 Laravel 内部配置。

HTTP 内核还负责通过应用程序的中间件堆栈传递请求。这些中间件处理读取和写入 HTTP 会话,确定应用程序是否处于维护模式,验证 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 相当空。此提供者是添加您应用程序自己的引导和服务容器绑定的好地方。对于大型应用程序,您可能希望创建多个服务提供者,每个服务提供者都为您的应用程序使用的特定服务提供更精细的引导。

Laravel 是最有效率的方式来
构建、部署和监控软件。