laravel容器是什麼? Laravel 服務容器是什麼?
在 Laravel 文件 中,有一段關於 Laravel 服務容器的介紹:
Laravel 服務容器是用於管理類別的依賴和執行依賴注入的工具。依賴注入這個花俏名詞實質上是指:類別的依賴項透過建構函數,或是某些情況下透過「setter」方法「注入」到類別中。
劃下重點,「Laravel 服務容器」是用於 管理類別的依賴 和 執行依賴注入 的 工具。
透過前一節「依賴注入基本概念」相關闡述,我們不難得出這樣一個簡單的結論「Laravel 服務容器」就是「依賴注入容器」。
其實,服務容器作為「依賴注入容器」去完成Laravel 所需依賴的註冊、綁定和解析工作只是「Laravel 服務容器」核心功能之一;另外,「Laravel 服務容器」還擔綱Laravel 應用的註冊程式的功能。
節選一段「深度挖掘Laravel 生命週期」一文中有關服務容器的內容:
建立應用程式實例即實例化Illuminate\Foundation\Application 這個服務容器,後續我們稱之為APP容器。在建立 APP 容器主要會完成:註冊應用的基礎路徑並將路徑綁定到 APP 容器 、註冊基礎服務提供者至 APP 容器 、註冊核心容器別名至 APP 容器 等基礎服務的註冊工作。
所以要了解Larvel 服務容器必然需要研究Illuminate\Foundation\Application 的建構子:
/** * 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框架入門教學專欄進行學習!
以上是laravel容器是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!