Skip to content

Commit f97301e

Browse files
committed
docs: Laravel 生命周期
1 parent be0ecde commit f97301e

File tree

1 file changed

+83
-0
lines changed

1 file changed

+83
-0
lines changed
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
## Laravel生命周期
2+
3+
为什么生命周期不在第一节开始讲,就怕如果不理解所谓的Ioc,Facade,中间件之类的概念,生命周期理解起来可能有一定的难度。
4+
5+
## laravel的源代码生命周期是什么样子的
6+
7+
第一步 Laravel 应用的所有请求入口都是 public/index.php 文件。打开index.php 发现代码也就几行。
8+
9+
```php
10+
11+
define('LARAVEL_START', microtime(true));
12+
13+
require __DIR__.'/../vendor/autoload.php';
14+
15+
$app = require_once __DIR__.'/../bootstrap/app.php';
16+
17+
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
18+
19+
$response = $kernel->handle(
20+
$request = Illuminate\Http\Request::capture()
21+
);
22+
23+
$response->send();
24+
25+
$kernel->terminate($request, $response);
26+
27+
```
28+
29+
下面我们来讲一下每一句代码的作用是什么?
30+
31+
```php
32+
33+
// 定义了laravel一个请求的开始时间
34+
define('LARAVEL_START', microtime(true));
35+
36+
// composer自动加载机制
37+
require __DIR__.'/../vendor/autoload.php';
38+
39+
// 这句话你就可以理解laravel,在最开始引入了一个ioc容器。
40+
$app = require_once __DIR__.'/../bootstrap/app.php';
41+
42+
// 打开__DIR__.'/../bootstrap/app.php';你会发现这段代码,绑定了Illuminate\Contracts\Http\Kernel::class,
43+
// 这个你可以理解成之前我们所说的$ioc->bind();方法。
44+
// $app->singleton(
45+
// Illuminate\Contracts\Http\Kernel::class,
46+
// App\Http\Kernel::class
47+
// );
48+
49+
// 这个相当于我们创建了Kernel::class的服务提供者
50+
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
51+
52+
// 获取一个 Request ,返回一个 Response。以把该内核想象作一个代表整个应用的大黑盒子,输入 HTTP 请求,返回 HTTP 响应。
53+
$response = $kernel->handle(
54+
$request = Illuminate\Http\Request::capture()
55+
);
56+
57+
// 就是把我们服务器的结果返回给浏览器。
58+
$response->send();
59+
60+
// 这个就是执行我们比较耗时的请求,
61+
$kernel->terminate($request, $response);
62+
63+
```
64+
65+
走到这里你会发现,是不是在我们学会了ioc,服务提供者理解起来就比较简单了。那$middleware,服务提供者都是在哪个文件注册运行的呢?
66+
67+
打开App\Http\Kernel::class这个文件,你会发现定义了一堆需要加载的$middleware。这个kernel的主要方法还是在他的父类里面 Illuminate\Foundation\Http\Kernel中。
68+
69+
打开Illuminate\Foundation\Http\Kernel,你会发现定义了启动时需要做的事呢?
70+
71+
```php
72+
protected $bootstrappers = [
73+
\Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables::class,
74+
\Illuminate\Foundation\Bootstrap\LoadConfiguration::class,
75+
\Illuminate\Foundation\Bootstrap\HandleExceptions::class,
76+
\Illuminate\Foundation\Bootstrap\RegisterFacades::class,
77+
\Illuminate\Foundation\Bootstrap\RegisterProviders::class,
78+
\Illuminate\Foundation\Bootstrap\BootProviders::class,
79+
];
80+
```
81+
82+
$bootstrappers 就定义了我们的 RegisterFacades.class,RegisterProviders.class 这两个类的意思就是要讲我们在app.config 中的Providers,Facades 注入到我们的 Ioc 容器中。具体是怎么执行的,我们下来可以打断点调试。
83+

0 commit comments

Comments
 (0)