Skip to content

[Feature] ServiceRegistry: factory map вместо switch/in_array #345

Description

@Ibochkarev

Описание функции

Упростить ServiceRegistry.php (~655 строк): убрать тройные hardcoded-списки сигнатур и switch для сложных зависимостей.

Проблема, которую решает

~43 ключа в $defaultServices с 'interface' => null. Конструкторы угадываются через controllersWithMs3Only / servicesWithModxAndMs3 / servicesWithDependencies + switch. Часть сервисов создаётся через new вне registry (ExtraFieldsService в routes, ManagerOrderCostRecalculator в OrdersController, Option* через фасады).

Хрупко при смене конструктора; DI не читается как таблица фактов.

Предлагаемое решение

  1. Явная map serviceId => callable(modx, services): object (или invokable factories).
  2. Зарегистрировать currently-orphan сервисы, которые уже «ядровые».
  3. Удалить in_array списки и default new $class($modx), если он скрывает ошибки конфигурации.
  4. Не вводить контейнер ради контейнера (Symfony DIC и т.п.) — достаточно понятного registry проекта.

Альтернативные варианты

  • Оставить switch, только документировать — долг остаётся.
  • Полный PSR-11 контейнер — шире, чем нужно Extra.

Критерии приёмки

  • Нет switch по class name для wiring (или один узкий legacy-карман с планом удаления).
  • Ключевые сервисы из Orders/Options/ExtraFields доступны через $modx->services.
  • Поведение boot MS3 без регрессий.

Дополнительный контекст

Делать после или вместе с #338 (OrdersController), чтобы cost/finalize сервисы сразу попали в map.

Metadata

Metadata

Assignees

Labels

enhancementNew feature or requestpriority: mediumСредний приоритетtech-debtMaintainability / refactor / architecture debt

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions