请求生命周期
介绍
在 “现实世界” 中使用任何工具时,如果你理解它是如何工作的,你会更有信心。应用程序开发也不例外。当你了解你的开发工具如何运作时,你会更舒适、更有信心地使用它们。
本文档的目标是为你提供一个关于 Laravel 框架的高层次概述。通过更好地了解整个框架,一切都会显得不那么 “神秘”,你在构建应用程序时会更有信心。如果你一开始没有完全理解所有术语,不要灰心!只要尝试基本理解发生了什么,随着你探索文档的其它部分,你的知识会不断增长。
生命周期概述
第一步
所有请求进入 Laravel 应用程序的入口点是 public/index.php
文件。所有请求都通过您的 Web 服务器(如 Apache / Nginx)的配置定向到这个文件。index.php
文件本身并不包含太多代码,它只是加载其余框架的起点。
index.php
文件加载了 Composer 生成的自动加载器定义,然后从 bootstrap/app.php
文件中检索 Laravel 应用程序的实例。Laravel 本身的第一个动作是创建应用程序 服务容器 的实例。
HTTP / 控制台核心
接下来,传入的请求将根据请求类型(HTTP 请求或命令请求)通过应用程序实例的 handleRequest
或 handleCommand
方法,分别发送到 HTTP 核心或控制台核心。这两个核心是所有请求流经的中心位置。现在,我们只关注 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
文件中找到应用程序所使用的用户定义的或第三方的服务提供者列表。
路由
一旦应用程序被引导并且所有服务提供者都已注册,请求将被交给路由器进行分发。路由器会将请求分发到相应的路由或控制器,并执行任何特定于路由的中间件。
中间件提供了一种方便的机制,用于过滤或检查进入应用程序的 HTTP 请求。例如,Laravel 包含一个中间件,用于验证应用程序的用户是否已认证。如果用户未认证,中间件将把用户重定向到登录页面;但如果用户已认证,中间件将允许请求继续进入应用程序。某些中间件会分配给应用程序中的所有路由,比如 PreventRequestsDuringMaintenance
,而某些则只会分配给特定的路由或路由组。您可以通过阅读完整的【中间件文档】来了解更多关于中间件的信息。
如果请求通过了所有匹配路由的中间件,路由或控制器方法将被执行,并且路由或控制器方法返回的响应将通过路由的中间件链发送回去。