構建方法傳入整個項目根目錄路徑(public文件夾上一級)將其設爲基礎路徑(存在本類basePath屬性中)。
__construct > setBasePath > bindPathsInContainer 在容器中綁定路徑
bindPathsInContainer > instance 在容器中註冊已有實例
{
$this->removeAbstractAlias($abstract);這個方法先刪除了容器中的對應實例別名
(abstractAliases與aliases有區別,存疑)
$this->rebound 而後若是該鍵名在bindings屬性instances屬性aliases屬性中任意一個存在,
則運行以前註冊該實例時綁定的回調函數進行更新
$this->instances[$abstract] = $instance 最後將路徑添加至instances屬性
}
__construct > registerBaseBindings
{
static::setInstance($this)將application實例註冊至Container抽象基類使其全局可用
將Illuminate\Container\Container綁定爲application類
綁定了PackageManifest類,vendor路徑與bootstrap/cache/packages.php裏的服務提供者路徑
}
__construct > registerBaseServiceProviders 註冊了event、日誌、路由的服務提供者
傳入相應的provider實例,並調用其register方法,將application實例傳入provider做爲參數進行回調。
RoutingServiceProvider在實例化的時候,又註冊了router、urlGenerator、redirector、request、response、dispatcher等類的實例。
將已註冊的provider進行標記$this->serviceProviders、$this->loadedProviders[get_class($provider)]
最後追蹤到container類的bind方法,也只是把回調函數加入了bindings屬性,並設置了是否共享而已
$app->singleton
__construct > registerCoreContainerAliases 將核心類路徑存入$this->aliases(別名爲鍵,類名爲值)與$this->abstractAliases(類名爲鍵,路徑組成的數組爲值)中,保存別名