主题
请求生命周期
简介
在现实世界中使用任何工具时,如果你理解该工具的工作原理,就会更有信心。应用程序开发也不例外。当你理解开发工具的运作方式时,使用它们会更加得心应手。
本文档的目标是让你对 Laravel 框架的工作方式有一个良好的、高层次的概述。通过更好地了解整个框架,一切都不再那么"神秘",你在构建应用程序时也会更加自信。如果你一时无法理解所有术语,不要灰心!只需尝试对正在发生的事情有一个基本的了解,随着你探索文档的其他部分,你的知识会不断增长。
生命周期概述
第一步
所有对 Laravel 应用程序的请求的入口点都是 public/index.php 文件。所有请求都通过你的 Web 服务器(Apache / Nginx)配置定向到该文件。index.php 文件不包含太多代码,它只是加载框架其余部分的起点。
index.php 文件加载 Composer 生成的自动加载器定义,然后从 bootstrap/app.php 获取 Laravel 应用程序的实例。Laravel 本身采取的第一个操作是创建应用程序 / service container 的实例。
HTTP / Console 内核
接下来,传入的请求会根据进入应用程序的请求类型,通过应用程序实例的 handleRequest 或 handleCommand 方法发送到 HTTP 内核或控制台内核。这两个内核充当所有请求流经的中心位置。目前,让我们只关注 HTTP 内核,它是 Illuminate\Foundation\Http\Kernel 的一个实例。
HTTP 内核定义了一组 bootstrappers(引导程序),这些引导程序将在请求执行之前运行。这些引导程序配置错误处理、配置日志记录、检测应用程序环境,以及执行在请求实际处理之前需要完成的其他任务。通常,这些类处理你不需要担心的内部 Laravel 配置。
HTTP 内核还负责将请求传递通过应用程序的 middleware 栈。这些 middleware 处理 HTTP session 的读写、确定应用程序是否处于维护模式、验证 CSRF 令牌等。我们很快会更多地讨论这些内容。
HTTP 内核的 handle 方法的签名非常简单:它接收一个 Request 并返回一个 Response。可以将内核想象为代表整个应用程序的一个大黑盒。向它提供 HTTP 请求,它将返回 HTTP 响应。
Service Provider
内核引导过程中最重要的操作之一是加载应用程序的 service provider。Service provider 负责引导框架的所有各种组件,如数据库、队列、验证和路由组件。
Laravel 会遍历此 provider 列表并实例化每个 provider。实例化 provider 后,将在所有 provider 上调用 register 方法。然后,一旦所有 provider 都已注册,将在每个 provider 上调用 boot 方法。这样做是为了 service provider 可以依赖于在其 boot 方法执行时所有容器绑定都已注册并可用。
本质上,Laravel 提供的每个主要功能都是由 service provider 引导和配置的。由于它们引导和配置了框架提供的众多功能,service provider 是整个 Laravel 引导过程中最重要的方面。
虽然框架内部使用了数十个 service provider,但你也可以选择创建自己的 provider。你可以在 bootstrap/providers.php 文件中找到应用程序正在使用的用户定义或第三方 service provider 的列表。
路由
一旦应用程序被引导并且所有 service provider 都已注册,Request 将被交给路由器进行分发。路由器会将请求分发到路由或控制器,并运行任何特定于路由的 middleware。
Middleware 提供了一种方便的机制来过滤或检查进入应用程序的 HTTP 请求。例如,Laravel 包含一个 middleware,用于验证应用程序的用户是否已通过认证。如果用户未通过认证,middleware 将把用户重定向到登录页面。然而,如果用户已通过认证,middleware 将允许请求继续深入应用程序。一些 middleware 被分配给应用程序中的所有路由,如 PreventRequestsDuringMaintenance,而一些则仅分配给特定路由或路由组。你可以通过阅读完整的 middleware 文档 了解更多关于 middleware 的信息。
如果请求通过了所有匹配路由分配的 middleware,路由或控制器方法将被执行,路由或控制器方法返回的响应将通过路由的 middleware 链发送回去。
完成
一旦路由或控制器方法返回响应,响应将通过路由的 middleware 向外传回,使应用程序有机会修改或检查传出的响应。
最后,一旦响应通过 middleware 传回,HTTP 内核的 handle 方法将响应对象返回给应用程序实例的 handleRequest,该方法在返回的响应上调用 send 方法。send 方法将响应内容发送到用户的 Web 浏览器。我们现在已经完成了整个 Laravel 请求生命周期的旅程!
聚焦 Service Provider
Service provider 确实是引导 Laravel 应用程序的关键。创建应用程序实例,注册 service provider,然后将请求交给已引导的应用程序。就是这么简单!
牢牢掌握 Laravel 应用程序如何通过 service provider 构建和引导是非常有价值的。应用程序的用户定义 service provider 存储在 app/Providers 目录中。
默认情况下,AppServiceProvider 是相当空的。这个 provider 是添加你自己的应用程序引导和 service container 绑定的好地方。对于大型应用程序,你可能希望创建多个 service provider,每个 provider 对应用程序使用的特定服务进行更细粒度的引导。