Files
XC_VM/docs/ru/development/architecture.md
T
Divarion_D fda7f41258 refactor(ministra): move Stalker portal from module into core (src/Ministra)
Ministra stops being a module — the whole Stalker portal (portal.php,
MinistraBootstrap, PortalHandler/PortalHelpers and the STB front-end) now
lives in src/Ministra/ under the XcVm\Ministra namespace, served at
/home/xc_vm/Ministra via the nginx alias.

- src/ministra/* and Modules/ministra_85a7d/{PortalHandler,PortalHelpers}
  → src/Ministra/; MinistraModule.php + module.json removed. Ministra was
  the only committed module, so src/Modules/ keeps a .gitkeep.
- portal.php resolves PortalHandler as a sibling and derives MAIN_HOME from
  its new location (glob crutch gone).
- nginx alias + AuthRepository $rAlias switched to /home/xc_vm/Ministra
  (PascalCase); ministra entry dropped from bundled_modules.php.
- Makefile: Modules/ removed from LB_DIRS — all modules are MAIN-only, so
  the ~50 MB of portal assets no longer ship to LB nodes.
- ArchitectureTest: zero committed modules is now a valid state.
- PHPStan: analyse src/Ministra, exclude the procedural portal.php entry,
  repath the ministra baseline entries.
- Docs (architecture, ministra-browser-emulation, extraction plan) updated
  to the new layout; the "extract to a separate repo" plan is cancelled.

Verified: php -l, make gates, make phpstan (No errors), full unit suite
(432 tests). On-server smoke: handshake + get_profile work end-to-end with
a registered MAC after deploy.
2026-08-11 21:41:11 +03:00

5.2 KiB
Raw Blame History

Обзор архитектуры

Тип проекта

Структурированный PHP-монолит с модульным слоем расширений.

  • Без DDD, Hexagonal или Clean Architecture — намеренное решение.
  • Разделение по контекстам с минимумом абстракций: Controller → Service → Repository.
  • Два артефакта сборки из одной кодовой базы: MAIN (полная панель) и LB (load balancer).

Структура src

Путь Роль
src/Core/ Инфраструктурные примитивы: DI-контейнер, события, HTTP, конфиг, auth, логирование
src/Domain/ Бизнес-контексты: Stream, VOD, Line, User, Server, Security и др.
src/Modules/ Опциональный слой расширений — загружается ModuleLoader
src/Public/ Front controller, router, controllers, views, assets
src/Cli/ Консольные команды и точки входа для cron
src/Ministra/ Stalker Portal — в ядре; отдаётся по /home/xc_vm/Ministra

Модель рантайма

Зависимости направлены внутрь — модули могут использовать core и domain, но не наоборот.

Public/index.php
    └── XC_Bootstrap::boot(BootContext::ADMIN)
            └── ServiceContainer (DI)
                    ├── EventDispatcher (PSR-14)
                    ├── ModuleLoader → loadAll() → bootAll()
                    └── Router → dispatch()

Domain-классы получают базу данных через инъекцию setDb() (вызывается из bootstrap.php::wireDomainDatabase()). global $db в web-пути запроса отсутствует.


Система модулей

Модули — изолированные директории в src/Modules/ с манифестом module.json и классом, расширяющим BaseModule. Полный справочник: Система модулей.

src/Modules/my-module/
├── module.json           # метаданные
├── MyModuleModule.php    # extends BaseModule, namespace XcVm\Module\MyModule
└── ...

Контексты Bootstrap

Четыре контекста определяют набор инициализируемых подсистем. Подробнее: Контексты Bootstrap.

Контекст Применение
BootContext::MINIMAL Скрипты, которым нужны только пути/конфиг
BootContext::CLI Cron-задачи и CLI-команды
BootContext::STREAM Стриминговые эндпоинты
BootContext::ADMIN Панель администратора / реселлера

Варианты сборки (MAIN vs LB)

MAIN LB
Панель администратора ✅ ❌
Стриминг ✅ ✅
Система модулей ✅ подмножество

Управляется enum ServerEnvironment и полем environment в module.json (main / lb / any).


Ключевые точки расширения

Механизм Как использовать
PSR-14 события EventDispatcher::listen() или атрибут #[ListensTo]
Декорирование сервисов $container->decorate('id', callable, priority)
Stream middleware Реализовать StreamMiddlewareProviderInterface
Cron-записи Переопределить getCronEntries() в классе модуля
DB-миграции Реализовать MigratableInterface::getMigrations()

Правила для контрибьюторов

  1. Модули не должны изменять файлы ядра.
  2. Запрещены eval, monkey patching и подмена файлов во время выполнения.
  3. Любой модуль можно отключить через config/modules.php без изменений ядра.
  4. Защищённые сервисы (db, settings, config, auth) нельзя декорировать.
  5. EN и RU документация обновляются в одном коммите.

Связанные файлы

Файл Роль
src/Core/ Примитивы фреймворка (DI, события, HTTP, конфиг, auth, логирование)
src/Domain/ Бизнес-контексты (Stream, VOD, Line, User, Server, Security)
src/Infrastructure/ Внешние адаптеры (DatabaseFactory, CacheReader, Redis)
src/Streaming/ Стриминг-подсистема
src/Modules/ Опциональные модули (загружаются ModuleLoader)
src/Public/ Front controller, контроллеры, view
src/Cli/ Консольные команды и cron-задачи