请求生命周期
概述
在使用任何“现实世界”中的工具时,如果你了解该工具的工作原理,你会感到更自信。应用程序开发也不例外。当你理解你的开发工具如何运作时,你会更舒适、更自信地使用它们。本文档的目标是为你提供一个关于 Laravel 框架如何“工作”的良好高层次概述。通过更好地了解整体框架,一切都会显得不那么“神秘”,你将更有信心构建你的应用程序。如果你一开始不理解所有的术语,不要灰心!只需尝试对发生的事情有一个基本的了解,随着你探索文档的其他部分,你的知识会不断增长。
请求生命周期
所有进入你应用程序的请求都通过 public/index.php
脚本进行处理。当使用 Apache 时,随 Laravel 提供的 .htaccess
文件处理所有请求并将其传递给 index.php
。从这里,Laravel 开始处理请求并返回响应给客户端。了解 Laravel 启动过程的一般概念将是有用的,因此我们现在将对此进行介绍!
在学习 Laravel 的启动过程时,最重要的概念是 服务提供者。你可以通过打开 app/config/app.php
配置文件并找到 providers
数组来找到服务提供者的列表。这些提供者作为 Laravel 的主要启动机制。但在深入研究服务提供者之前,让我们回到 index.php
。请求进入你的 index.php
文件后,将加载 bootstrap/start.php
文件。该文件创建新的 Laravel Application
对象,该对象也充当 IoC 容器。
在创建 Application
对象后,将设置一些项目路径并执行 环境检测。然后,将调用一个内部的 Laravel 启动脚本。该文件位于 Laravel 源代码的深处,并根据你的配置文件设置一些其他设置,例如时区、错误报告等。但是,除了设置这些相对琐碎的配置选项外,它还做了一件非常重要的事情:注册为你的应用程序配置的所有服务提供者。
简单的服务提供者只有一个方法:register
。当服务提供者通过应用程序自己的 register
方法与应用程序对象注册时,将调用此 register
方法。在此方法中,服务提供者将内容注册到 IoC 容器。本质上,每个服务提供者将一个或多个 闭包 绑定到容器中,这使你能够在应用程序中访问这些绑定的服务。因此,例如,QueueServiceProvider
注册解析各种 队列 相关类的闭包。当然,服务提供者可以用于任何启动任务,而不仅仅是将内容注册到 IoC 容器。服务提供者可以注册事件监听器、视图作曲家、Artisan 命令等。
在所有服务提供者注册后,将加载你的 app/start
文件。最后,将加载你的 app/routes.php
文件。一旦加载了 routes.php
文件,请求对象将被发送到应用程序,以便将其分派到路由。
那么,让我们总结一下:
- 请求进入
public/index.php
文件。 bootstrap/start.php
文件创建应用程序并检测环境。- 内部
framework/start.php
文件配置设置并加载服务提供者。 - 加载应用程序
app/start
文件。 - 加载应用程序
app/routes.php
文件。 - 请求对象发送到应用程序,返回响应对象。
- 响应对象发送回客户端。
现在你对请求如何处理 Laravel 应用程序有了一个良好的了解,让我们更仔细地看看“启动”文件!
启动文件
你的应用程序的启动文件存储在 app/start
中。默认情况下,应用程序中包含三个文件:global.php
、local.php
和 artisan.php
。有关 artisan.php
的更多信息,请参阅 Artisan 命令行 的文档。
global.php
启动文件默认包含一些基本项,例如注册 Logger 和包含你的 app/filters.php
文件。然而,你可以自由地在此文件中添加任何你希望的内容。它将在每次请求到达应用程序时自动包含,而不论环境如何。另一方面,local.php
文件仅在应用程序在 local
环境中执行时调用。有关环境的更多信息,请查看 配置 文档。
当然,如果你除了 local
之外还有其他环境,你可以为那些环境创建启动文件。当你的应用程序在该环境中运行时,它们将被自动包含。因此,例如,如果你在 bootstrap/start.php
文件中配置了一个 development
环境,你可以创建一个 app/start/development.php
文件,该文件将在任何请求进入该环境时被包含。
在启动文件中放置什么
启动文件是放置任何“启动”代码的简单地方。例如,你可以注册一个视图作曲家,配置你的日志偏好,设置一些 PHP 设置,等等。这完全取决于你。当然,将所有启动代码放入启动文件中可能会变得混乱。对于大型应用程序,或者如果你觉得启动文件变得混乱,考虑将一些启动代码移动到 服务提供者 中。
应用事件
注册应用事件
你还可以通过注册 before
、after
、finish
和 shutdown
应用事件来进行请求前和请求后的处理:
App::before(function($request)
{
//
});
App::after(function($request, $response)
{
//
});
这些事件的监听器将在每次请求到达你的应用程序之前和之后运行。这些事件对于全局过滤或全局修改响应非常有用。你可以在一个启动文件中或在 服务提供者 中注册它们。
你还可以在 matched
事件上注册一个监听器,该事件在传入请求已匹配到路由但该路由尚未执行时触发:
Route::matched(function($route, $request)
{
//
});
finish
事件在响应从你的应用程序发送回客户端后被调用。这是进行任何最后处理的好地方。shutdown
事件在所有 finish
事件处理程序完成处理后立即被调用,是在脚本终止之前做任何工作的最后机会。你可能不需要使用这两个事件中的任何一个。