简要了解了laravel中的一个请求流程的源码实现,主要熟悉了框架处理一个请求的生命周期过程,具体其他类细节本篇暂不做展开。
生命周期大概的时序图如下:
入口文件
/public/index.php
文件为项目的入口文件,这个文件的流程如下:
- 注册自动加载机制(composer autoload)
- 创建应用主体对象(继承于Container容器),注入对应的Kernel
- 注册内核类,获取Kernel对象解析请求响应
应用主体
Application
对象是整个应用的主体,也可以认为是服务容器,在请求初始化之前,应用主体主要工作如下:
- 绑定自身实例到容器中
下述代码中可以看到,应用主体绑定自身实例到app与Container容器。
protected function registerBaseBindings()
{
static::setInstance($this);
$this->instance('app', $this);
$this->instance('Illuminate\Container\Container', $this);
}
- 注册基础服务提供者
protected function registerBaseServiceProviders()
{
$this->register(new EventServiceProvider($this));
$this->register(new RoutingServiceProvider($this));
}
上述代码可知晓,注册了事件服务提供者与路由服务提供者到当前容器。其内部运行过程大概是实例化时构造函数传入当前应用主体$app
实例,注入依赖关系,register
方法里面调用服务提供者。
- 注册核心容器映射关系
保存在当前应用主体$app
对象中的aliases
属性中,映射别名与类名(命名空间)字符串直接的关系。
绑定内核类到容器处理请求与响应
- 绑定接口到容器之中
$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
);
- 获取内核实例,处理请求并返回
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
$response = $kernel->handle(
$request = Illuminate\Http\Request::capture()
);
$response->send();
$kernel->terminate($request, $response);
上面几行代码,主要的工作就是,获取内核实例,调用内核实例的handle
函数处理请求request
的实例获得返回响应。
简要说明下,laravel中的所有请求都要经过内核`kernel`类,通过`kernel`中的`handle`处理对应的请求,在请求过程中,会经过对应的路由去分发请求,通过内部实现的pipeline管道完成中间件中对请求的处理,最后返回对应的响应结果,这里只是简要说明,具体详细需要更大的篇幅。