ServiceLocator и внедрение зависимостей
Сервис-локатор ядра (Bitrix\Main\DI\ServiceLocator) реализует стандарт PSR-11 и поддерживает регистрацию служб через конфигурационные файлы .settings.php модулей и проекта. Службы по умолчанию создаются как синглтоны с автоматическим разрешением зависимостей через autowire, а регистрация в глобальном .settings.php позволяет переопределять сервисы модулей без правок их кода.
Прогресс хранится в этом браузере. Войдите, чтобы сохранить его в аккаунте.
Что нужно понимать
-
1
Регистрация сервисов
-
2
Получение сервисов
-
3
Dependency Injection
Материалы
Официальная документация
-
Контроллеры: раздел «Автоваринг» Новая дока
Проверь себя
Сервис описан в .settings.php модуля, но get('shop.priceCalculator') в агенте падает, хотя в компоненте работает. Где искать причину?
В подключении модуля. Сервисы модуля регистрируются внутри Loader::includeModule() через registerByModuleSettings(). В компоненте модуль уже кто-то подключил, в агенте — нет. Перед get() должен быть includeModule().
Чем регистрация в /bitrix/.settings.php отличается от регистрации в .settings.php модуля, кроме места?
Приоритетом. registerByModuleSettings() пропускает коды, которые уже есть в локаторе, а глобальный файл читается при старте ядра. Так проект переопределяет сервис модуля, не трогая сам модуль — тот же приём ядро использует для main.imageEngine.
Autowire не может создать класс, у которого в конструкторе string $apiKey. Что делать?
Локатор резолвит только параметры с типом класса или интерфейса либо со значением по умолчанию; для скаляра он бросит ServiceNotFoundException. Такой сервис регистрируют явно с constructorParams или с замыканием constructor.
Два вызова get() по одному коду вернули один и тот же объект. Это всегда так?
По умолчанию да: локатор кладёт созданный объект в instantiated и отдаёт его повторно. Если сервису нужен новый экземпляр на каждый вызов, в конфигурации ставят singleton => false.
Не сходится?
Спросите ассистента BXMax: он знает документацию и материалы сайта по этой теме.
Знаете материал лучше?
Предложите ссылку: после проверки она появится в этом разделе.
Войти, чтобы предложить