服務定位器
服務定位器
服務定位器是一個了解如何提供各種應用所需的服務(或組件)的對象。在服務定位器中,每個組件都隻有一個單獨的實例,並通過ID 唯一地標識。用這個 ID 就能從服務定位器中得到這個組件。
在 Yii 中,服務定位器是 [[yii\di\ServiceLocator]] 或其子類的一個實例。
最常用的服務定位器是application(應用)對象,可以通過 \Yii::$app
訪問。它所提供的服務被稱為application components(應用組件),比如:request
、response
、urlManager
組件。可以通過服務定位器所提供的功能,非常容易地配置這些組件,或甚至是用你自己的實現替換掉他們。
除了 application 對象,每個模塊對象本身也是一個服務定位器。
要使用服務定位器,第一步是要注冊相關組件。組件可以通過 [[yii\di\ServiceLocator::set()]] 方法進行注冊。以下的方法展示了注冊組件的不同方法:
- use yii\\di\\ServiceLocator;
- use yii\\caching\\FileCache;
- $locator = new ServiceLocator;
- // 通過一個可用於創建該組件的類名,注冊 "cache" (緩存)組件。
- $locator->set('cache', 'yii\\caching\\ApcCache');
- // 通過一個可用於創建該組件的配置數組,注冊 "db" (數據庫)組件。
- $locator->set('db', [
- 'class' => 'yii\\db\\Connection',
- 'dsn' => 'mysql:host=localhost;dbname=demo',
- 'username' => 'root',
- 'password' => '',
- ]);
- // 通過一個能返回該組件的匿名函數,注冊 "search" 組件。
- $locator->set('search', function () {
- return new app\\components\\SolrService;
- });
- // 用組件注冊 "pageCache" 組件
- $locator->set('pageCache', new FileCache);
一旦組件被注冊成功,你可以任選以下兩種方式之一,通過它的 ID 訪問它:
- $cache = $locator->get('cache');
- // 或者
- $cache = $locator->cache;
如上所示, [[yii\di\ServiceLocator]] 允許通過組件 ID 像訪問一個屬性值那樣訪問一個組件。當你第一次訪問某組件時,[[yii\di\ServiceLocator]] 會通過該組件的注冊信息創建一個該組件的實例,並返回它。之後,如果再次訪問,則服務定位器會返回同一個實例。
你可以通過 [[yii\di\ServiceLocator::has()]] 檢查某組件 ID 是否被注冊。若你用一個無效的 ID 調用 [[yii\di\ServiceLocator::get()]],則會拋出一個異常。
因為服務定位器,經常會在創建時附帶配置信息,因此我們提供了一個可寫的屬性,名為 [[yii\di\ServiceLocator::setComponents()|components]],這樣就可以配置該屬性,或一次性注冊多個組件。下麵的代碼展示了如何用一個配置數組,配置一個應用並注冊"db","cache" 和 "search" 三個組件:
- return [
- // ...
- 'components' => [
- 'db' => [
- 'class' => 'yii\\db\\Connection',
- 'dsn' => 'mysql:host=localhost;dbname=demo',
- 'username' => 'root',
- 'password' => '',
- ],
- 'cache' => 'yii\\caching\\ApcCache',
- 'search' => function () {
- return new app\\components\\SolrService;
- },
- ],
- ];