一个 Laravel 请求的完整生命周期

为什么生命周期不在第一节开始讲,就怕如果不理解所谓的IoC、Facade、中间件之类的概念,生命周期理解起来生命周期理解出来可能有一定的难度。

源码剖析

Laravel 应用的所有请求入口都是 public/index.php 文件。打开index.php 发现代码也就几行。


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

require __DIR__.'/../vendor/autoload.php';

$app = require_once __DIR__.'/../bootstrap/app.php';

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

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

$response->send();

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

下面我们来讲一下每一句代码的作用是什么?


// 定义了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';你会发现这段代码,绑定了Illuminate\Contracts\Http\Kernel::class,这个你可以理解成之前我们所说的$ioc->bind();方法。

$app->singleton(
    Illuminate\Contracts\Http\Kernel::class,
    App\Http\Kernel::class
);

// 这个相当于我们创建了Kernel::class的服务提供者
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

// 获取一个 Request ,返回一个 Response。以把该内核想象作一个代表整个应用的大黑盒子,输入 HTTP 请求,返回 HTTP 响应。
$response = $kernel->handle(
    $request = Illuminate\Http\Request::capture()
);

// 就是把我们服务器的结果返回给浏览器。
$response->send(); 

// 这个就是执行我们比较耗时的请求,
$kernel->terminate($request, $response);

走到这里你会发现,是不是在我们学会了IoC,服务提供者理解起来就比较简单了。那$middleware,服务提供者都是在哪个文件注册运行的呢?

打开App\Http\Kernel::class这个文件,你会发现定义了一堆需要加载的$middleware。这个kernel的主要方法还是在他的父类里面 Illuminate\Foundation\Http\Kernel中。

打开Illuminate\Foundation\Http\Kernel,你会发现定义了启动时需要做的事呢?

protected $bootstrappers = [
    \Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables::class,
    \Illuminate\Foundation\Bootstrap\LoadConfiguration::class,
    \Illuminate\Foundation\Bootstrap\HandleExceptions::class,
    \Illuminate\Foundation\Bootstrap\RegisterFacades::class,
    \Illuminate\Foundation\Bootstrap\RegisterProviders::class,
    \Illuminate\Foundation\Bootstrap\BootProviders::class,
];

$bootstrappers 就定义了我们的RegisterFacades.class,RegisterProviders.class 这两个类的意思就是要讲我们在app.config 中的Providers、Facades 注入到我们的 IoC 容器中。具体是怎么执行的,我们下来可以打断点调试。

cxp1539 has written 16 articles

该作者很低调,还没有自我介绍~

积分:786 等级:P5 职业:未设置 城市:未设置

1 条回复

  1. chinaguopeng chinaguopeng says:

    你好,请问你这是Laravel 5.几的啊 为什么我的5.5的 __DIR__.'/../bootstrap/app.php'; 文件一点都不一样啊

登录后才能进行评论,立即登录?