Skip to content

请求生命周期

概述

在使用任何“现实世界”中的工具时,如果你了解该工具的工作原理,你会感到更自信。应用程序开发也不例外。当你理解你的开发工具如何运作时,你会更舒适、更自信地使用它们。本文档的目标是为你提供一个关于 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 文件,请求对象将被发送到应用程序,以便将其分派到路由。

那么,让我们总结一下:

  1. 请求进入 public/index.php 文件。
  2. bootstrap/start.php 文件创建应用程序并检测环境。
  3. 内部 framework/start.php 文件配置设置并加载服务提供者。
  4. 加载应用程序 app/start 文件。
  5. 加载应用程序 app/routes.php 文件。
  6. 请求对象发送到应用程序,返回响应对象。
  7. 响应对象发送回客户端。

现在你对请求如何处理 Laravel 应用程序有了一个良好的了解,让我们更仔细地看看“启动”文件!

启动文件

你的应用程序的启动文件存储在 app/start 中。默认情况下,应用程序中包含三个文件:global.phplocal.phpartisan.php。有关 artisan.php 的更多信息,请参阅 Artisan 命令行 的文档。

global.php 启动文件默认包含一些基本项,例如注册 Logger 和包含你的 app/filters.php 文件。然而,你可以自由地在此文件中添加任何你希望的内容。它将在每次请求到达应用程序时自动包含,而不论环境如何。另一方面,local.php 文件仅在应用程序在 local 环境中执行时调用。有关环境的更多信息,请查看 配置 文档。

当然,如果你除了 local 之外还有其他环境,你可以为那些环境创建启动文件。当你的应用程序在该环境中运行时,它们将被自动包含。因此,例如,如果你在 bootstrap/start.php 文件中配置了一个 development 环境,你可以创建一个 app/start/development.php 文件,该文件将在任何请求进入该环境时被包含。

在启动文件中放置什么

启动文件是放置任何“启动”代码的简单地方。例如,你可以注册一个视图作曲家,配置你的日志偏好,设置一些 PHP 设置,等等。这完全取决于你。当然,将所有启动代码放入启动文件中可能会变得混乱。对于大型应用程序,或者如果你觉得启动文件变得混乱,考虑将一些启动代码移动到 服务提供者 中。

应用事件

注册应用事件

你还可以通过注册 beforeafterfinishshutdown 应用事件来进行请求前和请求后的处理:

php
App::before(function($request)
{
	//
});

App::after(function($request, $response)
{
	//
});

这些事件的监听器将在每次请求到达你的应用程序之前和之后运行。这些事件对于全局过滤或全局修改响应非常有用。你可以在一个启动文件中或在 服务提供者 中注册它们。

你还可以在 matched 事件上注册一个监听器,该事件在传入请求已匹配到路由但该路由尚未执行时触发:

php
Route::matched(function($route, $request)
{
	//
});

finish 事件在响应从你的应用程序发送回客户端后被调用。这是进行任何最后处理的好地方。shutdown 事件在所有 finish 事件处理程序完成处理后立即被调用,是在脚本终止之前做任何工作的最后机会。你可能不需要使用这两个事件中的任何一个。