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
放入container
的instances
屬性中,並以$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等