Архитектура ядра: слои, DDD, Clean Architecture, CQRS

Документ описывает архитектурные принципы ядра core/ и взаимодействие слоёв, а также общий поток запроса через ядро и модули.

1. Принципы

Проект построен на трёх взаимосвязанных подходах:

  1. DDD (Domain-Driven Design) — бизнес-логика сосредоточена в доменных сущностях и value objects; модули = bounded contexts.
  2. Clean Architecture — зависимости направлены внутрь: presentation → application → domain, а infrastructure реализует порты (интерфейсы) домена/приложения.
  3. CQRS — разделение команд (запись) и запросов (чтение).

Правило зависимостей: ни один слой не должен знать о слое «выше». Domain не знает об Application, Application — о Presentation/Infrastructure. Infrastructure знает обо всех (реализует порты), Presentation знает Application (через хендлеры) и Domain (через DTO).

2. Слои ядра

graph TD
    P[Presentation<br/>контроллеры, request-модели, middleware] -->|вызывает хендлеры| A[Application<br/>команды/запросы, хендлеры, DTO, порты]
    A -->|использует доменные сущности/VO| D[Domain<br/>сущности, события, исключения, VO]
    I[Infrastructure<br/>репозитории, AR, миграции, шина событий, обработчик ошибок] -.->|реализует порты| A
    I -.->|реализует интерфейсы репозиториев| D
    S[Security<br/>YiiIdentity] -->|используется в| P
    I -->|использует| S

2.1. Presentation (core/presentation)

2.2. Application (core/application)

2.3. Domain (core/domain)

Домен не зависит от Yii, БД и HTTP.

2.4. Infrastructure (core/infrastructure)

2.5. Security (core/security)

3. Поток запроса (полный)

sequenceDiagram
    autonumber
    participant C as Клиент (frontend)
    participant W as Yii App
    participant PA as PassportAuthMiddleware
    participant RB as RbacMiddleware
    participant CT as Контроллер
    participant H as CQRS Handler
    participant R as Repository (инфраструктура)
    participant DB as MySQL

    C->>W: HTTP-запрос (куки/Authorization)
    W->>PA: passport auth check
    PA->>W: identity установлен (YiiIdentity)
    W->>RB: rbac check (public? rule? permission?)
    RB->>W: разрешено / 401 / 403
    W->>CT: dispatch к контроллеру
    CT->>H: команда/запрос
    H->>R: порт репозитория
    R->>DB: SQL
    DB-->>R: данные
    R-->>H: сущность/результат
    H-->>CT: DTO
    CT-->>C: JSON (item/items/error)

Детали middleware — в modules/rbac/middleware.md и modules/passport/flow.md.

4. CQRS

4.1. Команды (запись)

Классы в core/application/command/:

КомандаХендлерНазначение
CreateRoleCommandCreateRoleHandlerСоздать роль
UpdateRoleCommandUpdateRoleHandlerОбновить роль
DeleteRoleCommandDeleteRoleHandlerУдалить роль
AssignUserRoleCommandAssignUserRoleHandlerНазначить роль пользователю
RemoveUserRoleCommandRemoveUserRoleHandlerСнять роль с пользователя
SyncUserCommandSyncUserHandlerСинхронизировать пользователя с Passport

4.2. Запросы (чтение)

Классы в core/application/query/:

ЗапросХендлерНазначение
ListRoleQueryListRoleHandlerСписок ролей с фильтрами
GetRoleQueryGetRoleHandlerРоль по ID
ListUserQueryListUserHandlerСписок пользователей с фильтрами
GetUserQueryGetUserHandlerПользователь по ID
ListUserRoleQueryListUserRoleHandlerНазначения ролей с фильтрами

4.3. Жизненный цикл

graph LR
    A[Контроллер] -->|создаёт| B[Command / Query]
    B --> C[Handler]
    C -->|порт| D[Repository]
    D -->|сущности| C
    C -->|DTO| A

5. Взаимодействие ядра и модулей

6. Существующие диаграммы (PlantUML)