服務定位器(Service Locator)

2018-02-24 15:40 更新

服務定位器

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

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

最常用的服務定位器是application(應用)對象,可以通過?\Yii::$app?訪問。它所提供的服務被稱為application components(應用組件),比如:requestresponse、urlManager?組件。可以通過服務定位器所提供的功能,非常容易地配置這些組件,或甚至是用你自己的實現(xiàn)替換掉他們。

除了 application 對象,每個模塊對象本身也是一個服務定位器。

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

use yii\di\ServiceLocator;
use yii\caching\FileCache;

$locator = new ServiceLocator;

// 通過一個可用于創(chuàng)建該組件的類名,注冊 "cache" (緩存)組件。
$locator->set('cache', 'yii\caching\ApcCache');

// 通過一個可用于創(chuàng)建該組件的配置數(shù)組,注冊 "db" (數(shù)據(jù)庫)組件。
$locator->set('db', [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;dbname=demo',
    'username' => 'root',
    'password' => '',
]);

// 通過一個能返回該組件的匿名函數(shù),注冊 "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 會通過該組件的注冊信息創(chuàng)建一個該組件的實例,并返回它。之后,如果再次訪問,則服務定位器會返回同一個實例。

你可以通過 yii\di\ServiceLocator::has() 檢查某組件 ID 是否被注冊。若你用一個無效的 ID 調(diào)用 yii\di\ServiceLocator::get(),則會拋出一個異常。

因為服務定位器,經(jīng)常會在創(chuàng)建時附帶配置信息,因此我們提供了一個可寫的屬性,名為 yii\di\ServiceLocator::setComponents(),這樣就可以配置該屬性,或一次性注冊多個組件。下面的代碼展示了如何用一個配置數(shù)組,配置一個應用并注冊"db","cache" 和 "search" 三個組件:?`````php 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;
    },
],

];?`````

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號