laravel 框架 源码解读 02 index.php 文件剩余代码

$app = require_once DIR.’/../bootstrap/app.php’;
引入laravel的启动应用文件 实际为服务容器的创建和绑定的过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php

创建服务容器实例 参数为项目根目录地址
$app = new Illuminate\Foundation\Application(
realpath(__DIR__.'/../')
);

为服务容器绑定了 一个单例 此为http核心类
$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
);
返回容器对象
return $app;

以下是入口文件index.php剩下的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
从服务容器中得到刚才绑定的类  make会创建一个对象并且 如果是单例模式 只会创建一次

看的出是http的核心类 参数是laravel的接口类名 在刚才的app文件中已经对这个接口进行了绑定
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

http核心类处理请求 得到response对象 实际的kernel类在vendor/laravel/framework/src/Illuminate/Foundation/Http 文件夹下
$response = $kernel->handle(
$request = Illuminate\Http\Request::capture() 初始化并创建了一个request类 就是symfony的组件request
);
/*
可以看一下代码 就是对请求的处理 也是编写代码执行的地方
public function handle($request)
{
try {
$request->enableHttpMethodParameterOverride();

$response = $this->sendRequestThroughRouter($request);
} catch (Exception $e) {
$this->reportException($e);

$response = $this->renderException($request, $e);
} catch (Throwable $e) {
$this->reportException($e = new FatalThrowableError($e));

$response = $this->renderException($request, $e);
}

event(new Events\RequestHandled($request, $response));

return $response;
}


protected function sendRequestThroughRouter($request)
{
$this->app->instance('request', $request);把request对象 绑定到服务容器的这个key中

Facade::clearResolvedInstance('request');

$this->bootstrap();
为让服务容器 执行 核心类的初始化数组。其中有很多类
/*
\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,
*/

创建了一个管道类 执行了核心的中间件。再分发到了路由类 又有一个管道类 处理了一波中间件 这里很复杂 也是laravel被称为黑盒的原因
return (new Pipeline($this->app))
->send($request)
->through($this->app->shouldSkipMiddleware() ? [] : $this->middleware)
->then($this->dispatchToRouter());
}
*/
response对象 执行发送http的回应方法
$response->send();

$kernel->terminate($request, $response); 命令行的处理方法