129  /  381

Регистрация локатора

Просмотров: 23499
Дата последнего изменения: 27.10.2020
Роберт Басыров
Сложность урока:
3 уровень - средняя сложность. Необходимо внимание и немного подумать.
1
2
3
4
5
Недоступно в редакциях:
Ограничений нет

Регистрация сервиса

Регистрация сервиса через файлы настроек 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

Конфигурация сервиса

Конфигурация описывается в виде массива и подсказывает сервис локатору способ создания объекта. На данный момент есть три способа описания:

  1. Указание класса сервиса. Сервис локатор создаст сервис вызвав new $className.
     'someModule.someServiceName' => [
                'className' => \VendorName\SomeModule\Services\SomeService::class,
            ]
  2. Указание класса сервиса и параметров, которые будут переданы в конструктор. Сервис локатор создаст сервис вызвав 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'];
                },
            ]
  3. Указание замыкания-конструктора, которые должно создать и вернуть объект сервиса.
     'someModule.someAnotherServiceName' => [
                'constructor' => static function () {
                    return new \VendorName\SomeModule\Services\SecondService('foo', 'bar');
                },
            ]

16
Курсы разработаны в компании «1С-Битрикс»

Если вы нашли неточность в тексте, непонятное объяснение, пожалуйста, сообщите нам об этом в комментариях.
Развернуть комментарии