Laravel 5.5 底层原理:生命周期

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lamp_yang_3533/article/details/85220510

简介

当你理解了 Laravel 的工作原理,用起来才能游刃有余。

这篇文档的目标就是从更高层面向你阐述 Laravel 框架的工作原理。通过对框架更全面的了解,你将会更加自信地构建应用。

如果你不能马上理解所有的内容,不要失去信心!先试着掌握一些基本的东西,你的知识水平将会随着对文档的探索而不断提升。

生命周期概览

请求的入口文件

Laravel 应用的所有请求入口都是 public/index.php 文件,所有请求都会被 web 服务器(Apache/Nginx)导向这个文件。

index.php 文件包含的代码并不多,但它是加载框架其它部分的起点。

<?php

define('LARAVEL_START', microtime(true));

// Register The Auto Loader
require __DIR__.'/../vendor/autoload.php';

// 创建 Laravel 应用实例(建服务容器实例)
$app = require_once __DIR__.'/../bootstrap/app.php';

// 运行应用,通过 kernel 处理请求并给出响应

$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

$response = $kernel->handle(
    $request = Illuminate\Http\Request::capture()
);

$response->send();

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

在 index.php 文件中载入 Composer 生成的自动加载设置,然后从 bootstrap/app.php 获取 Laravel 应用实例。

应用的引导文件

bootstrap/app.php 引导文件的作用是:

  • 创建 app 服务容器实例
  • 在服务容器上注册(绑定)Laravel 框架的核心接口
  • 返回服务容器
<?php

// 创建服务容器
$app = new Illuminate\Foundation\Application(
    realpath(__DIR__.'/../')
);

// 绑定(注册)接口到服务容器

// 绑定 App\Http\Kernel,用于处理 web 请求
$app->singleton(
    Illuminate\Contracts\Http\Kernel::class,
    App\Http\Kernel::class
);

// 绑定 App\Console\Kernel,用于处理 CLI 请求
$app->singleton(
    Illuminate\Contracts\Console\Kernel::class,
    App\Console\Kernel::class
);

// 绑定 App\Exceptions\Handler,用于处理异常
$app->singleton(
    Illuminate\Contracts\Debug\ExceptionHandler::class,
    App\Exceptions\Handler::class
);

// 返回服务容器
return $app;

Laravel 的第一个动作就是创建 app 服务容器实例。

HTTP/Console 内核

接下来,请求被发送到 HTTP 内核或 Console 内核(分别用于处理 Web 请求和 Artisan 命令),这取决于进入应用的请求类型。

这两个内核是所有请求都要经过的中央处理器,现在,让我们聚焦在位于 app/Http/Kernel.php 的 HTTP 内核。

HTTP 内核继承自 Illuminate\Foundation\Http\Kernel 类,该类定义了一个 bootstrappers 数组,这个数组中的类在请求被执行前运行,这些 bootstrappers 配置了错误处理、日志、检测应用环境以及其它在请求被处理前需要执行的任务。

HTTP 内核还定义了一系列所有请求在处理前需要经过的 HTTP 中间件,这些中间件处理 HTTP 会话的读写、判断应用是否处于维护模式、验证 CSRF 令牌等等。

HTTP 内核的 handle 方法签名相当简单:获取一个 Request,返回一个 Response,可以把 HTTP 内核看作一个代表整个应用的大黑盒子,输入 HTTP 请求,返回 HTTP 响应。

服务提供者

内核启动过程中最重要的动作之一就是为应用载入服务提供者。

应用的所有服务提供者都配置在 config/app.php 配置文件的 providers 数组中。

首先,所有提供者的 register 方法被调用,然后,所有提供者被注册之后,boot 方法被调用。

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

分发请求

一旦应用被启动并且所有的服务提供者被注册,Request 将会被交给路由器进行分发,路由器将会分发请求到路由或控制器,同时运行所有路由指定的中间件。

聚焦服务提供者

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

应用默认的服务提供者存放在 app/Providers 目录下。

对 Laravel 应用如何通过服务提供者构建和启动有一个牢固的掌握非常有价值。

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

猜你喜欢

转载自blog.csdn.net/lamp_yang_3533/article/details/85220510