diff --git a/docs/guide-ru/concept-service-locator.md b/docs/guide-ru/concept-service-locator.md new file mode 100644 index 0000000000..7b7c33e98b --- /dev/null +++ b/docs/guide-ru/concept-service-locator.md @@ -0,0 +1,90 @@ +Service Locator +=============== + +Service Locator является объектом, который знает, как обеспечить всевозможные службы (или компоненты), которые могут понадобиться в приложении. +В пределах Service Locator `а, каждый компонент имеет только один экземпляр, который уникально определяется с помощью идентификатора (ID). +Уникальный идентификатор (ID) может быть использован для извлечения компонента из Service Locator`а. + +В Yii Service Locator является экземпляром класса [[yii\di\ServiceLocator]] или его дочернего класса. + +Наиболее часто используемый Service Locator в Yii - это объект *приложения*, который можно получить через +`\Yii::$app`. Обеспечиваемые им службы называют *компонентами приложения*, такие как `запрос`, `ответ`, компоненты +`UrlManager'а`. Вы легко можете настроить эти компоненты или даже заменить их собственными реализациями, +благодаря функциональным службам, предоставляемым Service Locator`ом. + +Помимо объекта приложения, объект каждого модуля так же является Service Locator’ом. + +Для использования Service Locator`а первым шагом является регистрация компонентов. +Компонент может быть зарегистрирован с помощью [[yii\di\ServiceLocator::set()]]. +Следующий код демонстрирует различные способы регистрации компонентов: + +```php +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), +одним из двух следующих способов: + +```php +$cache = $locator->get('cache'); +// or alternatively +$cache = $locator->cache; +``` + +Как видно выше, [[yii\di\ServiceLocator]] позволяет обратиться к компоненту, как к свойству, +при помощи идентификатора (ID) компонента. +При обращении к компоненту впервые, [[yii\di\ServiceLocator]] будет использовать информацию о регистрации компонента, +что бы создать новый экземпляр компонента и вернёт его. +В дальнейшем при обращении к компоненту снова, Service Locator вернёт тот же экземпляр. + + +Что бы проверить, был ли идентификатор (ID) компонента уже зарегистрирован, можно использовать [[yii\di\ServiceLocator::has()]]. +Если вы вызовете [[yii\di\ServiceLocator::get()]] с недопустимым идентификатором (ID), тогда будет выброшено исключение. + + + +Поскольку Service Locator`ы зачастую создаются с [конфигурациями](concept-configurations.md), +записываемое свойство с именем [[yii\di\ServiceLocator::setComponents()|components]] предоставляется так, +что Вы можете его настроить и зарегистрировать несколько компонентов одновременно. +Следующий код демонстрирует конфигурационный массив, +который может использоваться для настройки приложения и регистрации компонентов "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; + }, + ], +]; +```