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