Skip to content

[Feature] Split god-services: GridConfig / OptionLoader / ProductData #365

Closed

Description

@Ibochkarev

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

Внутренняя декомпозиция уже существующих Services (не «переезд в Services»):

Класс LOC Разрез
GridConfigService ~905 repository + validators по типу колонки (template/relation/computed/actions/option)
OptionLoaderService ~787 ProductOptionLoader / AdminOptionFields / CaptionOverlayResolver
ProductDataService ~735 Option/Link/Repeater/Pricing collaborators

Поведение mgr API без изменений.

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

Файлы уже в правильном слое, но несколько bounded contexts в одном классе. #352 только memoize getGridConfig — не снимает god-service. Правки колонок грида, caption overlay и product save конфликтуют в одном PR-диффе.

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

Phase A — GridConfig

  • GridConfigRepository (get/save persistence)
  • Type validators / editors уже частично (GridColumnEditorType, GridEditorReferenceRegistry) — дожать ownership addField/updateField ~130–140 строк
  • Фасад GridConfigService оркестрирует

Phase B — OptionLoader

  • Загрузка значений товара vs поля админки vs caption overlays — разные классы
  • Prefetch batch остаётся у loader продукта

Phase C — ProductData

  • Save categories/options/links/repeater/price hooks → collaborators; ProductDataService = facade

Порядок: A → B → C (или параллельно разными авторами). Не смешивать с Vue (#354) в одном PR.

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

Примеры использования

Новый тип колонки грида = новый validator-класс, не ветка в 900-строчном сервисе.

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

  • Ни один из трёх файлов > ~500 LOC после разреза (ориентир).
  • Публичные методы, которыми пользуются контроллеры, сохранены или имеют тонкий facade.
  • #352 не ломается / учитывается.
  • php -l + smoke grid-config save и product data save.

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

Tracker: #361. Option subservices связаны с DI #363.

Activity

  1. added
    priority: mediumСредний приоритет
    enhancementNew feature or request
    tech-debtMaintainability / refactor / architecture debt
    on Jul 15, 2026
  2. self-assigned this
    on Aug 10, 2026
  3. Ibochkarev commented on Aug 10, 2026

    @Ibochkarev
    MemberAuthor

    Все три фазы влиты в beta — issue закрываю.

    Phases

    Phase PR Merged
    A GridConfig #513 2026-08-10
    B OptionLoader #514 2026-08-10
    C ProductData #515 2026-08-10

    Acceptance (на origin/beta)

    AC Status
    Фасады ≤ ~500 LOC OK: GridConfigService 477, OptionLoaderService 110, ProductDataService 349
    Публичный API через facade OK: контроллеры по-прежнему ходят в фасады; коллабораторы под Services/Grid/*, Services/Option/*, Services/Product/*
    #352 не ломается OK: memoize остаётся отдельным треком (#488), уже перебазирован на фасад Phase A
    CI / smoke на PR фаз зелёные на merge

    Out of scope этого issue: Vue thin composables (#354), memoize #352.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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