在"真实世界"中使用任何工具时,如果你了解该工具的工作原理,你会感觉更自信。应用程序开发亦是如此。当你理解你的开发工具如何运作时,你使用它们会感觉更自在和自信。
本文档的目标是为您提供关于 Laravel 框架工作原理的良好、高层概述。通过更好地了解整个框架,一切都会感觉不那么“神奇”,您将更有信心构建您的应用程序。如果您没有立即理解所有术语,请不要灰心!只需尝试对正在发生的事情有一个基本的了解,随着您探索文档的其他部分,您的知识将会增长。
Laravel 应用程序所有请求的入口点是 public/index.php 文件。所有请求都由你的 Web 服务器 (Apache / Nginx) 配置定向到此文件。该 index.php 文件不包含太多代码。相反,它是加载其余框架的起点。
index.php 文件加载 Composer 生成的自动加载器定义,然后从 bootstrap/app.php 检索 Laravel 应用程序的一个实例。Laravel 本身执行的第一个操作是创建一个应用程序 / 服务容器的实例。
接下来,传入的请求会被发送到 HTTP 内核或控制台内核,使用应用实例的 handleRequest 或 handleCommand 方法,这取决于进入应用的请求类型。这两个内核充当着所有请求流经的中心位置。目前,我们只关注 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 方法将响应内容发送到用户的网络浏览器。我们现在已经完成了整个 Laravel 请求生命周期的旅程!
服务提供者确实是引导 Laravel 应用程序的关键。应用程序实例被创建,服务提供者被注册,并且请求被交给已引导的应用程序。确实就这么简单!
深入理解 Laravel 应用如何通过服务提供者构建和引导,是非常有价值的. 你的应用中用户定义的服务提供者存储在 app/Providers 目录中.
默认情况下,AppServiceProvider 相当空。这个服务提供者是添加你应用程序自己的引导和服务容器绑定的好地方。对于大型应用程序,你可能希望创建几个服务提供者,每个都为你的应用程序使用的特定服务提供更细粒度的引导。