php

简要了解laravel的生命周期

简要了解了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管道完成中间件中对请求的处理,最后返回对应的响应结果,这里只是简要说明,具体详细需要更大的篇幅。

Leave a Reply

Your email address will not be published.

eighteen + seven =