195 laravel 源碼分析-2

Illuminate\Foundation\Application


寫194-源碼分析的時候感覺有點費勁,想了想構造方法沒看就直接看make()了,這節把構造方法補上

這次從_construct()說起

1. registerBaseBindings()

static::setInstance($this);

講自身實例賦值給static::$instance

$this->instance('app', $this);

1.1 instance()

if (is_array($abstract)) {
    // $abstract 是這樣的一個數組 ['actual key' => 'alias']
    list($abstract, $alias) = $this->extractAlias($abstract);

    $this->alias($abstract, $alias);
}

此處使用`list`將extractAlias()返回的數組中的每個域依次賦值給list中的變量,調用alias()註冊到$this->aliases

$bound = $this->bound($abstract);

bound()中的寫法很好玩

return isset($this->bindings[$abstract]) || isset($this->instances[$abstract]);

instance()方法中最核心的就是下面這一行

$this->instances[$abstract] = $instance;

將傳入的$instance放入containerinstances屬性中,並以$abstract作爲key值,從此這個$instance可以在容器中共享

2. registerBaseServiceProviders( )

$this->register(new EventServiceProvider($this));
$this->register(new RoutingServiceProvider($this));

此處調用了register()方法,主要邏輯是調用每個provider自身的register(),
這些provider都有一個共同的父類 Illuminate\Support\ServiceProvider

Illuminate\Events\EventServiceProvider的register()

$this->app->singleton('events', function ($app) {
   return (new Dispatcher($app))->setQueueResolver(function () use ($app) {
        return $app->make('Illuminate\Contracts\Queue\Factory');
    });
});

上面的代碼將一個 Illuminate\Events\Dispatcher 對象以鍵 events 綁定到了容器 中,它負責實現事件的調度。

Illuminate\Routing\RoutingServiceProvider 的register()

$this->registerRouter();

$this->registerUrlGenerator();

$this->registerRedirector();

$this->registerPsrRequest();

$this->registerPsrResponse();

$this->registerResponseFactory();

route 被註冊,它是 Illuminate\Routing\Router 對象。

3.registerCoreContainerAliases()

將核心組件註冊到container中,如app,cache,blade等

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章