简介
在“现实世界”中使用任何工具时,如果您了解该工具的工作原理,您会感到更加自信。应用程序开发也不例外。当您了解您的开发工具如何运作时,您会更舒适、更自信地使用它们。
本文档的目的是为您提供一个关于 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 内核定义了一个 bootstrappers
数组,在执行请求之前会运行这些引导程序。这些引导程序配置错误处理、配置日志记录、检测应用程序环境 以及在实际处理请求之前需要完成的其他任务。通常,这些类处理您无需担心的内部 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
方法将响应内容发送到用户的网络浏览器。现在,我们已经完成了整个 Laravel 请求生命周期的旅程!
关注服务提供者
服务提供者确实是引导 Laravel 应用程序的关键。应用程序实例被创建,服务提供者被注册,然后请求被传递给已引导的应用程序。就是这么简单!
对如何通过服务提供者构建和引导 Laravel 应用程序有一个坚实的理解是非常有价值的。您的应用程序的用户定义服务提供者存储在app/Providers
目录中。
默认情况下,AppServiceProvider
相当空。这个提供者是添加应用程序自身的引导和服务容器绑定的好地方。对于大型应用程序,您可能希望创建多个服务提供者,每个服务提供者都为应用程序使用的特定服务提供更精细的引导。