laravel容器是什么

laravel容器是什么

laravel容器是什么?laravel 服務容器是什么?

在 Laravel 文檔 中,有一段關于 Laravel 服務容器的介紹:

Laravel 服務容器是用于管理類的依賴和執行依賴注入的工具。依賴注入這個花俏名詞實質上是指:類的依賴項通過構造函數,或者某些情況下通過「setter」方法「注入」到類中。

劃下重點,「Laravel 服務容器」是用于 管理類的依賴 和 執行依賴注入 的 工具。

通過前一節「依賴注入基本概念」相關闡述,我們不難得出這樣一個簡單的結論「Laravel 服務容器」就是「依賴注入容器」。

其實,服務容器作為「依賴注入容器」去完成 Laravel 所需依賴的注冊、綁定和解析工作只是 「Laravel 服務容器」核心功能之一;另外,「Laravel 服務容器」還擔綱 Laravel 應用的注冊程序的功能。

節選一段「深度挖掘 Laravel 生命周期」一文中有關服務容器的內容:

創建應用實例即實例化 IlluminateFoundationApplication 這個服務容器,后續我們稱其為 APP 容器。在創建 APP 容器主要會完成:注冊應用的基礎路徑并將路徑綁定到 APP 容器 、注冊基礎服務提供者至 APP 容器 、注冊核心容器別名至 APP 容器 等基礎服務的注冊工作。

所以要了解 Larvel 服務容器必然需要研究 IlluminateFoundationApplication 的構造函數:

/** ?????*?Create?a?new?Illuminate?application?instance. ?????* ?????*?@see?https://github.com/laravel/framework/blob/5.6/src/Illuminate/Foundation/Application.php#L162:27 ?????*?@param??string|null??$basePath ?????*?@return?void ?????*/ ????public?function?__construct($basePath?=?null) ????{ ????????if?($basePath)?{ ????????????$this->setBasePath($basePath); ????????} ????????$this->registerBaseBindings(); ????????$this->registerBaseServiceProviders(); ????????$this->registerCoreContainerAliases(); ????}

沒錯在 Application 類的構造函數一共完成 3 個操作的處理功能:

通過 registerBaseBindings() 方法將「App 實例(即 Laravel 服務容器)」自身注冊到「Laravel 服務容器」;

通過 registerBaseServiceProviders() 注冊應用 Laravel 框架的基礎服務提供者;

通過 registerCoreContainerAliases() 將具體的「依賴注入容器」及其別名注冊到「Laravel 服務容器」。

這里所說的「注冊」歸根到底還是在執行「Laravel 服務容器」的「綁定(bind)」操作,完成綁定接口到實現。

為了表名我所言非虛,讓我們看看 registerBaseBindings() 方法:

??/** ?????*?Register?the?basic?bindings?into?the?container.?注冊?App?實例本身到?App?容器 ?????* ?????*?@return?void ?????*/ ????protected?function?registerBaseBindings() ????{ ????????static::setInstance($this); ????????$this->instance('app',?$this); ????????$this->instance(Container::class,?$this); ????????$this->instance(PackageManifest::class,?new?PackageManifest( ????????????new?Filesystem,?$this->basePath(),?$this->getCachedPackagesPath() ????????)); ????}

我們知道 instance() 方法會將對象實例 $this 綁定到容器的 app 和 Container::class 接口。后續無論是通過 app()->make(‘app’) 還是 app()->make(Container::class) 獲取到的實現類都是 $this(即 Laravel 服務容器實例) 對象。有關 instance 的使用方法可以查閱 Laravel 服務容器解析文檔,不過我也會在下文中給出相關使用說明。

到這里相信大家對「Laravel 服務容器」有了一個比較清晰的理解了。

更多Laravel相關技術文章,請訪問Laravel框架入門教程欄目進行學習!

以上就是

? 版權聲明
THE END
喜歡就支持一下吧
點贊12 分享