请求生命周期
介绍
在“现实世界”中使用任何工具时,如果您了解该工具的工作原理,就会更有信心。应用程序开发也不例外。当您了解开发工具的工作原理时,您会在使用它们时更加自如和自信。
本文档旨在为您提供 Laravel 框架工作原理的全面概述。通过更好地了解整个框架,您将不再觉得一切都那么“神奇”,从而更有信心地构建应用程序。如果您暂时无法理解所有术语,请不要灰心!只需尝试基本掌握其中的内容,随着您探索文档的其他部分,您的知识将会不断增长。
生命周期概述
第一步
Laravel 应用程序所有请求的入口点都是该public/index.php
文件。所有请求都会通过您的 Web 服务器(Apache / Nginx)配置定向到该文件。该index.php
文件不包含太多代码,而是加载框架其余部分的起点。
该index.php
文件加载 Composer 生成的自动加载器定义,然后从中检索 Laravel 应用程序的实例。Laravel 本身采取的第一个操作是创建应用程序/服务容器bootstrap/app.php
的实例。
HTTP/控制台内核
接下来,根据进入应用程序的请求类型,传入的请求将使用应用程序实例的handleRequest
或handleCommand
方法发送到 HTTP 内核或控制台内核。这两个内核是所有请求流经的中心位置。现在,我们只关注 HTTP 内核,它是 的一个实例Illuminate\Foundation\Http\Kernel
。
bootstrappers
HTTP 内核定义了一个将在请求执行之前运行的数组。这些引导程序会配置错误处理、配置日志记录、检测应用程序环境,并执行在实际处理请求之前需要完成的其他任务。通常,这些类处理 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
几乎为空。此提供程序非常适合添加应用程序自身的引导和服务容器绑定。对于大型应用程序,您可能希望创建多个服务提供程序,每个提供程序都针对应用程序所使用的特定服务提供更精细的引导。