源码阅读 - 初始 : (1) 入口文件 index
入口文件 public/index.php
php
// 1) Composer 自动加载: 无需关心类库是如何被引入的
require __DIR__.'/../bootstrap/autoload.php';
// -- 定义 LARAVEL_START
// -- 加载 vendor/autoload.php
// 2) 加载App入口文件并初始化
$app = require_once __DIR__.'/../bootstrap/app.php';
// 3) 创建 kernel
$kernel = $app->make(Illuminate\\Contracts\\Http\\Kernel::class);
// 4) 处理请求
$response = $kernel->handle(
$request = Illuminate\\Http\\Request::capture()
);
// 5) 发送响应
$response->send();
// 6) 终止
$kernel->terminate($request, $response);
1) 自动加载
bootstrap/autoload.php
php
// 定义 LARAVEL_START
define('LARAVEL_START', microtime(true));
// 1) 加载 bootstrap 下的自动加载
require __DIR__.'/../vendor/autoload.php';
bootstrap 下的 自动加载
~/vendor/autoload.php
php
# 加载指定定义文件
vendor/composer/autoload_real.php
# 调用 loader
ComposerAutoloaderInitXX::getLoader();
# ? autoload_static.php
# : autoload_namespaces.php # 命名空间
autoload_psr4.php # 自行加载
autoload_classmap.php # 类的映射
# 加载文件
# autoload_files.php
2) 应用程序加载
bootstrap/app.php
php
// 1) 初始化 app
$app = new Illuminate\\Foundation\\Application(
realpath(__DIR__ . '/../')
);
/* 2) 绑定重要接口, 来源请求来自于 web 和 CLI
* 将两个类绑定, 进行自动加载的时候进行存储对象的获取
-------------------------------------------- */
// 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;
3) 生成加载器
php
// 创建 Kernel
$app->make(Illuminate\\Contracts\\Http\\Kernel::class)
php
// 获取引用
$abstract = $this->getAlias($abstract);
// 未加载则进行加载
if (isset($this->deferredServices[$abstract]) && ! isset($this->instances[$abstract])) {
$this->loadDeferredProvider($abstract);
# 注册 provider
}
// 返回实例化的对象
return parent::make($abstract, $parameters);
4) 处理请求
php
try {
// 启用 Http 方法重写
// 支持 在 post 方法下, 使用 _method 替代 PUT, DELETE 等方法
$request->enableHttpMethodParameterOverride();
// 1) 通过路由发送请求
$response = $this->sendRequestThroughRouter($request);
} catch (Exception $e) {
// 2) 异常处理和渲染
$this->reportException($e);
$response = $this->renderException($request, $e);
} catch (Throwable $e) {
$this->reportException($e = new FatalThrowableError($e));
$response = $this->renderException($request, $e);
}
// 3) 触发请求处理事件
$this->app['events']->dispatch(
new Events\\RequestHandled($request, $response)
);
return $response;
5) 发送响应
php
// 1) 发送 Header
$this->sendHeaders();
// 2) 发送内容
$this->sendContent();
if (function_exists('fastcgi_finish_request')) {
fastcgi_finish_request();
} elseif ('cli' !== PHP_SAPI) {
static::closeOutputBuffers(0, true);
}
return $this;
6) 终止程序
php
// 1) 终止中间件
$this->terminateMiddleware($request, $response);
// 2) 终止 App
$this->app->terminate();
说明
创建时间: 2023-01-15 00:32:00 , 最后编辑于 2023-12-21 12:12:00