服務定位器


服務定位器

服務定位器是一個了解如何提供各種應用所需的服務(或元件)的物件。在服務定位器中,每個元件都只有一個單獨的範例,並通過ID 唯一地標識。用這個 ID 就能從服務定位器中得到這個元件。

在 Yii 中,服務定位器是 [[yii\di\ServiceLocator]] 或其子類的一個範例。

最常用的服務定位器是application(應用)物件,可以通過 \Yii::$app 存取。它所提供的服務被稱為application components(應用元件),比如:requestresponseurlManager 元件。可以通過服務定位器所提供的功能,非常容易地組態這些元件,或甚至是用你自己的實現替換掉他們。

除了 application 物件,每個模組物件本身也是一個服務定位器。

要使用服務定位器,第一步是要註冊相關元件。元件可以通過 [[yii\di\ServiceLocator::set()]] 方法進行註冊。以下的方法展示了註冊元件的不同方法:

  1. use yii\\di\\ServiceLocator; 
  2. use yii\\caching\\FileCache; 
  3.  
  4. $locator = new ServiceLocator; 
  5.  
  6. // 通過一個可用於建立該元件的類名,註冊 "cache" (快取)元件。 
  7. $locator->set('cache', 'yii\\caching\\ApcCache'); 
  8.  
  9. // 通過一個可用於建立該元件的組態陣列,註冊 "db" (資料庫)元件。 
  10. $locator->set('db', [ 
  11.     'class' => 'yii\\db\\Connection', 
  12.     'dsn' => 'mysql:host=localhost;dbname=demo', 
  13.     'username' => 'root', 
  14.     'password' => '', 
  15. ]); 
  16.  
  17. // 通過一個能返回該元件的匿名函式,註冊 "search" 元件。 
  18. $locator->set('search', function () { 
  19.     return new app\\components\\SolrService; 
  20. }); 
  21.  
  22. // 用元件註冊 "pageCache" 元件 
  23. $locator->set('pageCache', new FileCache);

一旦元件被註冊成功,你可以任選以下兩種方式之一,通過它的 ID 存取它:

  1. $cache = $locator->get('cache'); 
  2. // 或者 
  3. $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" 三個元件:

  1. return [ 
  2.     // ... 
  3.     'components' => [ 
  4.         'db' => [ 
  5.             'class' => 'yii\\db\\Connection', 
  6.             'dsn' => 'mysql:host=localhost;dbname=demo', 
  7.             'username' => 'root', 
  8.             'password' => '', 
  9.         ], 
  10.         'cache' => 'yii\\caching\\ApcCache', 
  11.         'search' => function () { 
  12.             return new app\\components\\SolrService; 
  13.         }, 
  14.     ], 
  15. ];