Laravel 的请求生命周期
介绍
使用「现实世界」中的任何工具时,如果理解这个工具的运作原理,那么你会更加得心应手的使用这个工具。应用开发也是这样。当你明白你的开发工具如何运行的,你就会对它们的使用游 刃有余。
这篇文档的目的是让你更好的理解 Laravel 框架如何进行工作及它的工作原理。通过对框架进行全面的了解,一切都不会那么「神奇」,也将会让你更有自信的构建你的应用。如果你不能理解所有的这些术语,也不要丧失信心!只要对现在提到的东西有个基本概念,随着对本文档和其他章节的不断探索,你对它们的理解会不断提升。
生命周期概述
第一件事
一个 Laravel 应用的所有请求的入口都是 public/index.php
文件。 通过网页服务器 (Apache / Nginx) 所有请求都会导向这个文件。 index.php
文件没有太多的代码,只是加载框架其他部分的一个入口。
index.php
文件载入 Composer 生成的自动加载器定义,并从 bootstrap/app.php
文件获取到 Laravel 应用实例。Laravel 的第一个动作就是创建一个自身应用实例 / 服务容器。
HTTP / Console 内核
接下来,传入的请求会被发送给 HTTP 内核或者 console 内核,这根据进入应用的请求的类型而定。这两个内核服务是所有请求都经过的中枢。让我们现在只关注位于 app/Http/Kernel.php
的 HTTP 内核。
HTTP 内核继承自 Illuminate\Foundation\Http\Kernel
类,它定义了一个 bootstrappers
数组,数组中的类在请求真正执行前进行前置执行。 这些引导程序配置了错误处理,日志记录,检测应用程序环境,以及其他在请求被处理前需要完成的工作。
HTTP 内核同时定义了一个 HTTP 中间件 列表,所有的请求必须在处理前通过这些中间件,这些中间件处理 HTTP session 的读写,判断应用是否在维护模式, 验证 CSRF token 等等。
HTTP 内核的标志性 handle
方法是相当简单的:接收一个 Request
并返回一个 Response
。你可以把内核想成一个代表你应用的大黑盒子。给它喂 HTTP 请求然后它就会吐给你 HTTP 响应。
服务提供者
在内核引导启动的过程中最重要的动作之一就是载入 服务提供者 到你的应用。所有的服务提供者都配置在 config/app.php
文件中的 providers
数组中。 首先,所有提供者的 register
方法会被调用,接下来,一旦所有提供者注册完成,boot
方法将会被调用。
服务提供者负责引导启动框架的全部各种组件,例如数据库、队列、验证器以及路由组件。因为这些组件引导和配置了框架的各种功能,所以服务提供者是整个 Laravel 启动过程中最为重要的部分。