一个 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 容器中。具体是怎么执行的,我们下来可以打断点调试。
1 Comment
你好,请问你这是Laravel 5.几的啊 为什么我的5.5的
__DIR__.'/../bootstrap/app.php';
文件一点都不一样啊