请求生命周期
介绍
在使用任何“现实世界”中的工具时,如果你了解该工具的工作原理,你会感到更有信心。应用程序开发也不例外。当你理解你的开发工具如何运作时,你会更舒适、更自信地使用它们。
本文档的目标是为你提供一个关于 Laravel 框架如何工作的良好高层次概述。通过更好地了解整体框架,一切都会感觉不那么“神秘”,你将更有信心构建你的应用程序。如果你一开始不理解所有的术语,不要灰心!只需尝试对发生的事情有一个基本的了解,随着你探索文档的其他部分,你的知识将会增长。
生命周期概述
第一步
所有请求到 Laravel 应用程序的入口点是 public/index.php
文件。所有请求都通过你的 web 服务器(Apache / Nginx)配置指向这个文件。index.php
文件的代码不多。相反,它是加载其余框架的起点。
index.php
文件加载 Composer 生成的自动加载器定义,然后从 bootstrap/app.php
中检索 Laravel 应用程序的实例。Laravel 自身采取的第一个动作是创建应用程序 / 服务容器 的实例。
HTTP / 控制台内核
接下来,传入的请求会根据进入应用程序的请求类型发送到 HTTP 内核或控制台内核。这两个内核作为所有请求流经的中央位置。现在,让我们专注于 HTTP 内核,它位于 app/Http/Kernel.php
。
HTTP 内核扩展了 Illuminate\Foundation\Http\Kernel
类,该类定义了一组在请求执行之前运行的 bootstrappers
。这些引导程序配置错误处理、配置日志记录、检测应用程序环境,并执行在实际处理请求之前需要完成的其他任务。通常,这些类处理内部 Laravel 配置,你不需要担心。
HTTP 内核还定义了一系列所有请求在被应用程序处理之前必须通过的 HTTP 中间件。这些中间件处理读取和写入 HTTP 会话、确定应用程序是否处于维护模式、验证 CSRF 令牌 等等。我们稍后会详细讨论这些。
HTTP 内核的 handle
方法的签名非常简单:它接收一个 Request
并返回一个 Response
。可以将内核视为一个代表整个应用程序的大黑箱。将 HTTP 请求输入它,它将返回 HTTP 响应。
服务提供者
内核引导过程中的一个重要动作是加载应用程序的 服务提供者。服务提供者负责引导框架的各种组件,例如数据库、队列、验证和路由组件。应用程序的所有服务提供者都在 config/app.php
配置文件的 providers
数组中配置。
Laravel 将遍历此提供者列表并实例化每个提供者。在实例化提供者后,将调用所有提供者的 register
方法。然后,一旦所有提供者都已注册,将在每个提供者上调用 boot
方法。这是为了确保服务提供者在其 boot
方法执行时可以依赖于每个容器绑定已注册并可用。
本质上,Laravel 提供的每个主要功能都是由服务提供者引导和配置的。由于它们引导和配置了框架提供的许多功能,服务提供者是整个 Laravel 引导过程最重要的方面。
路由
应用程序中最重要的服务提供者之一是 App\Providers\RouteServiceProvider
。该服务提供者加载位于应用程序的 routes
目录中的路由文件。去看看 RouteServiceProvider
的代码,看看它是如何工作的!
一旦应用程序被引导并且所有服务提供者都已注册,请求将被交给路由器进行调度。路由器将请求调度到路由或控制器,并运行任何特定于路由的中间件。
中间件提供了一种方便的机制,用于过滤或检查进入应用程序的 HTTP 请求。例如,Laravel 包含一个中间件,用于验证应用程序的用户是否经过身份验证。如果用户未经过身份验证,中间件将重定向用户到登录屏幕。然而,如果用户已通过身份验证,中间件将允许请求进一步进入应用程序。一些中间件被分配给应用程序中的所有路由,例如在 HTTP 内核的 $middleware
属性中定义的那些,而一些仅分配给特定路由或路由组。你可以通过阅读完整的 中间件文档 来了解更多关于中间件的信息。
如果请求通过所有匹配路由的分配中间件,路由或控制器方法将被执行,路由或控制器方法返回的响应将通过路由的中间件链发送回去。
结束
一旦路由或控制器方法返回响应,响应将向外返回通过路由的中间件,给应用程序一个机会来修改或检查传出的响应。
最后,一旦响应通过中间件返回,HTTP 内核的 handle
方法返回响应对象,index.php
文件调用返回响应的 send
方法。send
方法将响应内容发送到用户的 web 浏览器。我们已经完成了整个 Laravel 请求生命周期的旅程!
关注服务提供者
服务提供者确实是引导 Laravel 应用程序的关键。应用程序实例被创建,服务提供者被注册,请求被交给引导后的应用程序。就是这么简单!
牢牢掌握 Laravel 应用程序是如何通过服务提供者构建和引导的非常有价值。你应用程序的默认服务提供者存储在 app/Providers
目录中。
默认情况下,AppServiceProvider
是相当空的。这个提供者是添加你应用程序自己的引导和服务容器绑定的好地方。对于大型应用程序,你可能希望创建多个服务提供者,每个提供者都有更细粒度的引导,针对应用程序使用的特定服务。