Просмотров: 18023
Дата последнего изменения: 19.11.2021
Сложность урока:
3 уровень - средняя сложность. Необходимо внимание и немного подумать.
4
5
Недоступно в лицензиях:
Ограничений нет
Описание
Сервис локатор (локатор служб) - это шаблон проектирования для удобной работы с сервисами приложения. Подробнее можно прочитать в
статье.
Идея сервиса в том, что вместо создания конкретных сервисов напрямую (с помощью new), используется специальный объект (сервис локатор), который будет отвечать за создание, нахождение сервисов. Своего рода реестр.
Класс \Bitrix\Main\DI\ServiceLocator
реализует интерфейс PSR-11. Доступен с версии main 20.5.400.
Простой пример использования:
$serviceLocator = \Bitrix\Main\DI\ServiceLocator::getInstance();
if ($serviceLocator->has('someService'))
{
$someService = $serviceLocator->get('someService');
//...$someService использование сервиса
}
Регистрация сервиса
Регистрация сервиса через файлы настроек bitrix/.settings.php
Прежде чем обращаться к сервису его необходимо зарегистрировать и один из способов это использование файлов настроек .settings.php. Все необходимые сервисы перечисляются в секции services.
[
'value' => [
'someServiceName' => [
'className' => \VendorName\Services\SomeService::class,
],
'someGoodServiceName' => [
'className' => \VendorName\Services\SecondService::class,
'constructorParams' => ['foo', 'bar'],
],
],
'readonly' => true,
],
//...
];
В итоге данные сервисы будут доступны сразу после инициализации ядра. О том, какие есть способы описания сервисов можно прочитать ниже.
$serviceLocator = \Bitrix\Main\DI\ServiceLocator::getInstance();
$someGoodServiceName = $serviceLocator->get('someGoodServiceName');
$someServiceName = $serviceLocator->get('someServiceName');
Регистрация сервиса через файлы настроек модуля {moduleName}/.settings.php
В корне модуля так же может располагаться свой файл .settings.php. И в нём можно описать сервисы, которые принадлежат данному модулю и используются в нём. Семантика аналогична описанию в глобальном bitrix/.settings.php
и правилам описания конфигураций.
[
'value' => [
'someModule.someServiceName' => [
'className' => \VendorName\SomeModule\Services\SomeService::class,
],
'someModule.someAnotherServiceName' => [
'constructor' => static function () {
return new \VendorName\SomeModule\Services\SecondService('foo', 'bar');
},
],
'someModule.someGoodServiceName' => [
'className' => \VendorName\SomeModule\Services\SecondService::class,
'constructorParams' => static function (){
return ['foo', 'bar'];
},
],
],
'readonly' => true,
],
//...
];
Внимание! Данные сервисы будут зарегистрированы только после подключения модуля. Также советуем именовать сервисы модулей, используя префикс имени модуля, чтобы не возникало проблемы уникальности кодов сервисов, например:
iblock.imageUploader
disk.urlManager
crm.entityManager
crm.urlManager
someModule.urlManager.
Регистрация сервиса через API
Сервисы можно зарегистрировать и через API. Для этого воспользуйтесь методами класса \Bitrix\Main\DI\ServiceLocator
Конфигурация сервиса
Конфигурация описывается в виде массива и подсказывает сервис локатору способ создания объекта. На данный момент есть три способа описания:
- Указание класса сервиса. Сервис локатор создаст сервис вызвав
new $className
.
'someModule.someServiceName' => [
'className' => \VendorName\SomeModule\Services\SomeService::class,
]
- Указание класса сервиса и параметров, которые будут переданы в конструктор. Сервис локатор создаст сервис вызвав
new $className('foo', 'bar')
.
'someModule.someServiceName' => [
'className' => \VendorName\SomeModule\Services\SomeService::class,
'constructorParams' => ['foo', 'bar'],
]
'someModule.someServiceName' => [
'className' => \VendorName\SomeModule\Services\SomeService::class,
'constructorParams' => static function (){
return ['foo', 'bar'];
},
]
- Указание замыкания-конструктора, который должен создать и вернуть объект сервиса.
'someModule.someAnotherServiceName' => [
'constructor' => static function () {
return new \VendorName\SomeModule\Services\SecondService('foo', 'bar');
},
]