生命周期

每个 laravel 请求(无论网络请求 or 命令行请求), 都将迅速被转换成 Illuminate Request 对象, 该对象经过多层最终由应用程序本身解析. 然后生成一个 Illuminate Response 对象, 该对象穿过多层,最终返回给用户.

生命周期简图

  1. { Middleware }
  2. Resuest --> { [ APP ] } --> Response
  3. { }

引导app

larave 的入口文件是 public/index.php .

入口文件做了,以下三件事.

  1. 首先, 加载 Composer 的自动加载文件. 即包含了composer的所有依赖关系.
  2. 接着, 它启动 laravel 的引导, 创建一个 app 容器(见 11章), 注册一些核心服务(包括 kernel等).
  3. 最后, 它创建 kernel 实例, 创建一个请求,代表当前用户的web请求, 并将请求传递给内核处理. 内核以 Illuminate Response 对象作为响应, index.php返回给最终用户. 然后, 内核终止页面请求.

Laravel’s 内核(kernel)

kernel 是每个 Laravel 应用程序的核心路由器, 负责接收用户请求, 通过中间对其进行处理, 捕获异常并将其传递给页面路由器, 然后返回最终响应.

其实有两个核心(kernel), 一个处理 web 请求 (the HTTP kernel) ; 另一个处理 console,cron, 和 Artisan 请求(the console kernel). 它们都有一个 handle() 方法, 负责获取 Request 对象, 并返回 Response 对象.

核心运行前,要先运行引导程序, 包括确定当前的运行环境( staging, local, production, etc ), 和运行所有服务提供者. HTTP kernel 还要明确包裹每个请求的中间件, 包含负责 sessionCSRF 保护的中间件.

服务提供者

尽管这些引导程序中包含一些程序代码,但几乎所有Laravel的引导程序代码都被分离为一些被称为服务提供者的东西。一个服务提供者是一个类,封装了应用程序的各个部分运行实现其核心功能的逻辑。

服务提供者的概念可能有点难以理解,因此请先这样理解: 当应用初始化时,应用程序的很多组件都有一些引导代码需要运行. 服务提供者是一种将引导代码按相关类分组的工具. 如果为了使应用程序正常工作, 您需要运行任何代码,那么强烈建议你使用服务提供者.

例如,如果您发现正在使用的功能需要在容器(见 11章)中注册某些类,则可以为该功能创建服务提供者.

服务提供者的boot(), register(), and deferring

服务提供者有两个重要的方法: boot(), register(). 5.8 版本之后还有一个 DeferrableProvider 接口. (5.7之前是 $defer 属性).

工作原理:

  1. 首先, register() 方法被调用, 这是绑定类和别名到容器中的地方, 不要做任何依赖于整个应用程序被引导的事情.
  2. 第二, boot() 方法被调用, 您现在可以在这里做任何其他的引导,例如绑定事件侦听器或定义路由等—-任何依赖于整个应用程序已经被引导的事情.

如果您的服务提供商只打算在容器中注册绑定(即,告诉容器如何解析给定的类或接口),但不执行任何其他引导,您可以“延迟”其注册,这意味着除非他们中的一个明确被容器请求, 否则它们将不会运行. 这样可以加快应用程序的平均启动时间。

如果你想延迟服务提供者的注册, 5.8+ 版本, 实现 Illuminate\Contracts\Support\DeferrableProvider 接口, 5.7 protected $defer 属性设置为 true. 然后,所有版本,都要增加一个 provides() 方法, 返回提供者提供的绑定列表.

例如:

  1. ...
  2. use Illuminate\Contracts\Support\DeferrableProvider;
  3. class GitHubServiceProvider extends ServiceProvider implements DeferrableProvider
  4. {
  5. public function provides()
  6. {
  7. return [
  8. GitHubClient::class,
  9. ];
  10. }