Laravel 启动过程

huazi 2020-06-02 AM 82℃ 0条

​ Laravel 框架采用 public/index.php 的单一入口进行启动:

// 定义 Laravel 一个请求的开始时间
define ('LARAVEL_START', microtime(true));

// composer 自动加载
require __DIR__.'/../vendor/autoload.php';

// Laravel 在最开始得到一个 Ioc 容器
$app = require_once __DIR__.'/../bootstrap/app.php';

// 打开__DIR__.'/../bootstrap/app.php';

// $app = new Illuminate\Foundation\Application(
//    realpath(__DIR__.'/../')
// );
// $app->singleton(
//     Illuminate\Contracts\Http\Kernel::class,
//     App\Http\Kernel::class
// );
// $app->singleton(
//     Illuminate\Contracts\Console\Kernel::class,
//     App\Console\Kernel::class
// );
// $app->singleton(
//     Illuminate\Contracts\Debug\ExceptionHandler::class,
//     App\Exceptions\Handler::class
// );

// 绑定了 Illuminate\Contracts\Http\Kernel::class,
// 这个可以理解成 $ioc->bind() 方法。
// 此外还有 console 和 exception 的服务容器绑定

// 创建 http\kernel::class 的服务提供者
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

// 下面就是接收 request 然后输出 response
$response = $kernel->handle(
  $request = Illuminate\Http\Request::capture()
);

$response->send();

$kernel->terminate($request, $response);
1.注册类文件自动加载器

Laravel 通过 composer 进行依赖管理,并在 bootstrap/autoload.php 中注册了 Composer Auto Loader,应用中类的命名空间将被映射到类文件的实际路径,不在需要开发者手动导入各种类文件,而由自动加载器自行导入。因此,Laravel 允许你将应用中定义的类放置在 Composer Auto Loader 能自动加载到的任意目录,大多数是放在 app目录 或者 app的子目录下。

2.创建服务容器

bootstrap/app.php 中获取到 Laravel 应用实例 $app (服务容器)。

3.创建 Http 和 Console 内核

传入的请求在 Http 和 Console 内核中进行预处理。HTTP 内核继承自 Illuminate\Foundation\Http\Kernel 类,其中注入了 $app 和 ​$router 两个实例,内核是完成应用引导、请求处理(包括通过Router转发请求等)的场所。HTTP Kernel 定义了一个 bootstrappers 数组,配置了环境变量加载、应用配置加载、错误处理,以及其他在请求被处理前需要完成的工作。

4.载入服务提供者至容器

在内核引导启动的过程中最重要的动作之一就是载入服务提供者到你的 $app (即所有的服务提供者都要挂载到服务容器下去执行),服务提供者负责引导启动框架的全部各种组件,例如数据库、队列、验证器以及路由组件。因为这些组件引导和配置了框架的各种功能,所以服务提供者是整个 Laravel 启动过程中最为重要的部分,所有的服务提供者都配置在 config/app.php 文件中的 providers 数组中。首先,所有提供者的 register 方法会被调用;一旦所有提供者注册完成,接下来,boot 方法将会被调用。

5.分发请求

一旦应用完成引导和所有服务提供者都注册完成,Request 将会移交给Router进行分发。在通过Router转发请求时,所有请求都必须先经过全局HTTP中间件栈的处理,再调度到Router并获得其回调,然后执行该回调。

6.发送响应并结束

由Response发送响应,然后由内核发出terminate,包括调用可终止的中间件(定义了terminate方法的全局HTTP中间件和路由中间件)、 $app 服务容器终止。

标签: Laravel

非特殊说明,本博所有文章均为博主原创。

评论啦~