Middle Bitrix Framework D7 Рекомендуется

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: он знает документацию и материалы сайта по этой теме.

Знаете материал лучше?

Предложите ссылку: после проверки она появится в этом разделе.

Войти, чтобы предложить
Поделиться в Telegram
Мы используем файлы cookie для улучшения работы сайта. Продолжая использовать сайт, вы соглашаетесь с нашей политикой конфиденциальности.
AI Домовой

AI Домовой История

на связи

пишет…
Нет истории чатов
AI Домовой

Нужна авторизация

Войдите, чтобы задавать вопросы AI Домовому.

Войти