Распознаватель служб
Распознаватель служб — это объект, который знает, как предоставлять всевозможные службы (или компоненты), которые может потребоваться приложению. Внутри распознавателя служб каждый компонент существует как единственный экземпляр, уникально идентифицируемый ID. Для получения компонента из распознавателя служб используется ID.
В Yii распознаватель служб — это просто экземпляр yii\di\ServiceLocator или подкласс.
Наиболее часто используемый распознаватель служб в Yii — это объект приложение, к которому можно получить доступ через \Yii::$app. Предоставляемые им службы называются компонентами приложения, такие как компоненты request, response, и urlManager. Эти компоненты можно настроить или даже заменить собственными реализациями с помощью функциональности, предоставляемой распознавателем служб.
Помимо объекта приложения, каждый объект модуля также является распознавателем служб.
Для использования распознавателя служб первым шагом является регистрация компонентов в нём. Компонент можно зарегистрировать через yii\di\ServiceLocator::set(). Следующий код демонстрирует различные способы регистрации компонентов:
use yii\di\ServiceLocator;
use yii\caching\FileCache;
$locator = new ServiceLocator;
// register "cache" using a class name that can be used to create a component
$locator->set('cache', 'yii\caching\ApcCache');
// register "db" using a configuration array that can be used to create a component
$locator->set('db', [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=demo',
'username' => 'root',
'password' => '',
]);
// register "search" using an anonymous function that builds a component
$locator->set('search', function () {
return new app\components\SolrService;
});
// register "pageCache" using a component
$locator->set('pageCache', new FileCache);
После регистрации компонента, к нему можно получить доступ по его ID двумя способами:
$cache = $locator->get('cache');
// or alternatively
$cache = $locator->cache;
Как показано выше, yii\di\ServiceLocator позволяет получить доступ к компоненту, как к свойству, используя ID компонента. При первом обращении к компоненту, yii\di\ServiceLocator использует информацию о регистрации компонента для создания нового экземпляра компонента и возвращает его. В дальнейшем, если к компоненту обратиться снова, распознаватель служб вернёт тот же экземпляр.
Можно использовать yii\di\ServiceLocator::has() для проверки, уже зарегистрирован ли ID компонента. Если вызвать yii\di\ServiceLocator::get() с неверным ID, будет выброшено исключение.
Поскольку распознаватели служб часто создаются с помощью конфигураций, предоставляется свойство для записи с именем components. Это позволяет настроить и зарегистрировать сразу несколько компонентов. Следующий код показывает массив конфигурации, который можно использовать для настройки распознавателя служб (например, приложения application) с компонентами 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 () {
$solr = new app\components\SolrService('127.0.0.1');
// ... other initializations ...
return $solr;
},
],
];
В примере выше есть альтернативный способ настройки компонента search. Вместо непосредственного написания PHP обратного вызова, который создаёт экземпляр SolrService, можно использовать статический метод класса для возврата такого обратного вызова, как показано ниже:
class SolrServiceBuilder
{
public static function build($ip)
{
return function () use ($ip) {
$solr = new app\components\SolrService($ip);
// ... other initializations ...
return $solr;
};
}
}
return [
// ...
'components' => [
// ...
'search' => SolrServiceBuilder::build('127.0.0.1'),
],
];
Этот альтернативный подход наиболее предпочтительнее, когда вы выпускаете компонент Yii, который инкапсулирует какую-либо стороннюю библиотеку, не связанную с Yii. Вы используете статический метод, как показано выше, для представления сложной логики создания объекта третьей стороны, а пользователь вашего компонента только вызывает статический метод для настройки компонента.
© 2008–2017 by Yii Software LLC
Licensed under the three clause BSD license.
http://www.yiiframework.com/doc-2.0/guide-concept-service-locator.html