Laravel 一次完整请求生命周期

简介

当我们使用现实世界中的任何工具时,如果理解了该工具的工作原理,那么用起来就会得心应手,应用开发也是如此。当你理解了开发工具如何工作,用起来就会更加游刃有余。

这篇文档的目标就是从更高层面向你阐述 Laravel 框架的工作原理。通过对框架更全面的了解,一切都不再那么神秘,你将会更加自信地构建应用。如果你不能马上理解所有这些条款,不要失去信心!先试着掌握一些基本的东西,你的知识水平将会随着对文档的探索而不断提升。

生命周期概览

Laravel 应用的所有请求入口都是 public/index.php 文件,所有请求都会被 web 服务器(Apache/Nginx)导向这个文件。 index.php 文件包含的代码并不多,该文件完成项目依赖服务的加载功能。首先它将 composer 生成的自动加载器引入项目
image.png
然后接收由 bootstrap/app.php 文件创建的应用实例。创建实例的过程即是项目初始化的过程

注册基本的绑定
app -> Application实例(Illuminate\Foundation\Application)
Illuminate\Container\Container -> Application实例
(Illuminate\Foundation\Application)
Laravel 一次完整请求生命周期_第1张图片

EventServieProvider —— 事件服务提供者

Laravel 一次完整请求生命周期_第2张图片

EventServieProvider —— 事件服务提供者
Laravel 一次完整请求生命周期_第3张图片

注册核心服务容器别名

Laravel 一次完整请求生命周期_第4张图片

设置根路径(如果传入的话)

Laravel 一次完整请求生命周期_第5张图片

HTTP/Console 内核

接下来,请求被发送到 HTTP 内核或 Console 内核(分别用于处理 Web 请求和 Artisan 命令),这取决于进入应用的请求类型。这两个内核是所有请求都要经过的中央处理器,现在,就让我们聚焦在位于 app/Http/Kernel.php 的 HTTP 内核。

HTTP 内核继承自 Illuminate\Foundation\Http\Kernel 类,该类定义了一个 bootstrappers 数组,这个数组中的类在请求被执行前运行,这些 bootstrappers 配置了错误处理、日志、[检测应用环境]以及其它在请求被处理前需要执行的任务。
Laravel 一次完整请求生命周期_第6张图片

注册共享的Kernel和异常处理器

  • Illuminate\Contracts\Http\Kernel -> App\Http\Kernel
  • Illuminate\Contracts\Console\Kernel -> App\Console\Kernel
  • Illuminate\Contracts\Debug\ExceptionHandler -> App\Exceptions\Handler

服务提供者

内核启动过程中最重要的动作之一就是为应用载入[服务提供者],应用的所有服务提供者都被配置在 config/app.php 配置文件的 providers 数组中。首先,所有提供者的 register 方法被调用,然后,所有提供者被注册之后, boot 方法被调用。

服务提供者负责启动框架的所有各种各样的组件,比如数据库、队列、验证器,以及路由组件等,正是因为他们启动并配置了框架提供的所有特性,所以服务提供者是整个 Laravel 启动过程中最重要的部分。

处理和分发请求

一旦应用被启动并且所有的服务提供者被注册, Request 将会被交给路由器进行分发,路由器将会分发请求到路由或控制器,同时运行所有路由指定的中间件。
解析Illuminate\Contracts\Http\Kernel,实例化App\Http\Kernel
image.png在make之前系统进行了单例绑定
Laravel 一次完整请求生命周期_第7张图片
在父类
Illuminate\Foundation\Http\Kernel 处理请求

a.构造函数:设置$app/$router,初始化$router中middleware数值
Laravel 一次完整请求生命周期_第8张图片

b.handle处理请求 —— 经过路由发送请求:
Laravel 一次完整请求生命周期_第9张图片

  • $request是经过Symfony封装的请求对象
  • 注册request实例到容器 ($app['request']->Illuminate\Http\Request)
  • 清空之前容器中的request实例
  • 调用bootstrap方法,启动一系列启动类的bootstrap方法:

Laravel 一次完整请求生命周期_第10张图片

Illuminate\Foundation\Bootstrap\DetectEnvironment 环境配置($app['env'])
Illuminate\Foundation\Bootstrap\LoadConfiguration  基本配置($app['config'])
Illuminate\Foundation\Bootstrap\ConfigureLogging   日志文件($app['log'])
Illuminate\Foundation\Bootstrap\HandleExceptions   错误&异常处理
Illuminate\Foundation\Bootstrap\RegisterFacades    清除已解析的Facade并重新启动,注册config文件中alias定义的所有Facade类到容器
Illuminate\Foundation\Bootstrap\RegisterProviders  注册config中providers定义的所有Providers类到容器
Illuminate\Foundation\Bootstrap\BootProviders      调用所有已注册Providers的boot方法

通过Pipeline发送请求,经过中间件,再由路由转发,最终返回响应

new Pipeline($this->app))
        ->send($request)
        ->through($this->middleware)
        ->then($this->dispatchToRouter()
c.将响应信息发送到浏览器:
$response->send();

d.处理继承自TerminableMiddleware接口的中间件(Session)并结束应用生命周期:

$kernel->terminate($request, $response);

聚焦服务提供者

服务提供者是启动 Laravel 应用中最关键的部分,应用实例被创建后,服务提供者被注册,请求被交给启动后的应用进行处理,整个过程就是这么简单!

对 Laravel 应用如何通过服务提供者构建和启动有一个牢固的掌握非常有价值,当然,应用默认的服务提供者存放在 app/Providers 目录下。

默认情况下,AppServiceProvider 是空的,这里是添加自定义启动和服务容器绑定的最佳位置,当然,对大型应用,你可能希望创建多个服务提供者,每一个都有着更加细粒度的启动。

下面的执行流程图详细描述了上述步骤的执行过程:

Laravel 一次完整请求生命周期_第11张图片

你可能感兴趣的:(php,laravel,lavarel)