Laravel生命周期

未匹配的标注

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

laravel的源代码生命周期是什么样子的

第一步 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 容器中。具体是怎么执行的,我们下来可以打断点调试。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
cxp1539
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
贡献者:2
讨论数量: 0
发起讨论 只看当前版本


暂无话题~