Репозитории ядра: порты и реализации

Документ описывает порты (интерфейсы) репозиториев ядра, их реализации и транзакции.

1. Порты (интерфейсы)

Все порты находятся в core/application/port/.

ИнтерфейсМетодыНазначение
IUserRepositorysave(User): void, findById(UserId): ?User, findByEmail(Email): ?User, existsByEmail(Email): bool, delete(UserId): void, …Пользователи
IRoleRepositorysave(Role): void, findById(RoleId): ?Role, findByName(RoleName): ?Role, delete(RoleId): void, …Роли
IUserRoleRepositoryassign(UserRole): void, remove(UserRoleId): void, sync(UserRole): void, findById(UserRoleId): ?UserRole, …Назначения ролей
IUserRoleSearchsearch(UserRoleFiltersDto): UserRole[], …Поиск назначений с фильтрами
ITransactionManagerrun(callable): mixedОбёртка транзакций
IEventDispatcheraddListener, dispatchШина событий
ITaskStatisticsService(см. tasks)Агрегация статистики задач (реализуется модулем tasks)

2. Реализации (infrastructure)

ПортРеализацияЗависимости
IUserRepositoryDbUserRepositoryYii::$app->db, UserAR
IRoleRepositoryDbRoleRepositoryYii::$app->db, RoleAR
IUserRoleRepositoryDbUserRoleRepositoryYii::$app->db, UserRoleAR
IUserRoleSearchDbUserRoleSearchYii::$app->db
ITransactionManagerDbTransactionManagerYii::$app->db
IEventDispatcherGlobalEventDispatcherконтейнер

3. ActiveRecord-модели (persistence)

core/infrastructure/persistence/:

МодельТаблица
UserARusers
RoleARroles
UserRoleARuser_roles

ActiveRecord-модели используются ТОЛЬКО внутри репозиториев. Хендлеры работают с доменными сущностями, а не с AR.

4. Схема таблиц

users

КолонкаТипОписание
idbigint PKID
passport_idstring(64) UNIQUEID в Passport
surnamestring(128)Фамилия
namestring(128)Имя
patronymicstring(128) NULLОтчество
emailstring(255) UNIQUEEmail
poststring(255) NULLДолжность
is_ownerboolean def falseВладелец (Passport)
synced_attimestamp NULLПоследняя синхронизация
created_at / updated_attimestampСлужебные

roles

КолонкаТип
idbigint PK
namestring(50) UNIQUE
descriptionstring(255) NULL
created_attimestamp

user_roles

КолонкаТипFK
idbigint PK
user_idbigint→ users.id (CASCADE)
role_idbigint→ roles.id (CASCADE)
assigned_attimestamp
assigned_bybigint NULL

Таблицы RBAC (модуль rbac)

permissions, role_permissions — см. modules/rbac/architecture.md.

5. Транзакции

ITransactionManager::run(callable) (реализация DbTransactionManager):

$this->transactionManager->run(function () use ($user): void {
    // несколько операций внутри одной транзакции
});

Использование: SyncUserHandler (создание пользователя + роли), хендлеры проектов/задач при необходимости.

6. Как добавить репозиторий

  1. Интерфейс в core/application/port/ (или modules/<m>/domain/repository/ для модулей).
  2. Реализация DbXxxRepository в core/infrastructure/repository/ (или modules/<m>/infrastructure/repository/).
  3. АР-модель в persistence/ (если нужно).
  4. Регистрация в DI (config/container.php для ядра, modules//config/di.php для модулей).
  5. Миграция таблицы.