mirror of
https://github.com/Vateron-Media/XC_VM.git
synced 2026-10-04 20:03:11 +02:00
The line-by-line web translator reordered words inside `**bold**` spans and misplaced/dropped the markers, producing `**LB` or `****` (empty bold). Mask each `**...**` as ONE atomic sentinel: translate the inner text on its own, then store the whole balanced `**inner**` — the engine never sees the markers and cannot reorder or collapse them. Also harden the anthropic prompt to keep emphasis balanced. Auto-prune: after translating, delete generated docs/ru files whose docs/en source no longer exists (renamed/removed) and drop now-empty dirs, so the tree mirrors docs/en 1:1 (removes the stale development/modules.md and guides/geoip-and-device-detection.md). Bump PROMPT_VERSION to 6 to invalidate the contaminated cache and regenerate docs/ru (0 broken bold spans remaining, aside from pre-existing multi-line bold that spans a soft line break).
111 lines
6.7 KiB
Markdown
111 lines
6.7 KiB
Markdown
# Обзор архитектуры
|
||
|
||
## Тип проекта
|
||
|
||
Структурированный монолит PHP с модульным дополнительным слоем.
|
||
|
||
- Никакого DDD, никакой гексагональности, никакой чистой архитектуры — намеренно.
|
||
- Split by context with minimal abstractions: `Controller → Service → Repository`.
|
||
- Два артефакта сборки из одной кодовой базы: **главный** (полная панель) и **фунт** (подмножество load balancer).
|
||
|
||
---
|
||
|
||
## Исходное дерево
|
||
|
||
|Путь|Роль|
|
||
| ---- | ---- |
|
||
| `src/Core/` |Примитивы фреймворка: Контейнер DI, события, HTTP/маршрутизатор, конфигурация, авторизация, ведение журнала|
|
||
| `src/Domain/` |Бизнес-контексты: Поток, VOD, линия, пользователь, сервер, безопасность и т.д.|
|
||
| `src/Infrastructure/` |Внешние адаптеры: `DatabaseFactory`, считыватели кэша, Redis, TMDb|
|
||
| `src/Streaming/` |Потоковая подсистема: bootstrap, аутентификация, доставка, балансировщик, защита|
|
||
| `src/Modules/` |Дополнительный слой расширения — загружается с помощью `ModuleLoader`|
|
||
| `src/Public/` |Передний контроллер, маршрутизатор, контроллеры, представления, ресурсы|
|
||
| `src/Cli/` |Консольные команды и точки входа в cron|
|
||
| `src/Ministra/` | Stalker Portal — in core; served at `/home/xc_vm/Ministra` |
|
||
|
||
---
|
||
|
||
## Модель времени выполнения
|
||
|
||
Зависимости перетекают друг в друга — модули могут использовать ядро и домен, но никогда наоборот.
|
||
|
||
```
|
||
Public/index.php
|
||
└── XC_Bootstrap::boot(BootContext::Admin)
|
||
└── ServiceContainer (DI)
|
||
├── EventDispatcher (PSR-14)
|
||
├── ModuleLoader → loadAll() → bootAll()
|
||
└── Router → dispatch()
|
||
```
|
||
|
||
Классы домена и модуля принимают **нет** и `$db` в своем конструкторе. Они
|
||
`use \XcVm\Infrastructure\Database\DatabaseAware` и вызываем `self::db()`, который лениво
|
||
устраняет общее соединение. `bootstrap.php::wireDomainDatabase()` устанавливает это соединение
|
||
**однажды** для каждой загрузки (через `DatabaseAware::setDb()`) — нет проводки для каждого класса и нет
|
||
`global $db` в пути веб-запроса.
|
||
|
||
---
|
||
|
||
## Модульная система
|
||
|
||
Модули представляют собой изолированные каталоги под `src/Modules/` с манифестом `module.json`
|
||
и класс, расширяющий `BaseModule`. Полную справочную информацию (и связанные страницы о жизненном цикле / точках расширения) смотрите в [Разработка модуля](module-authoring.md).
|
||
|
||
```
|
||
src/Modules/my-module/
|
||
├── module.json # metadata
|
||
├── MyModuleModule.php # extends BaseModule, namespace XcVm\Module\MyModule
|
||
└── ...
|
||
```
|
||
|
||
---
|
||
|
||
## Контексты начальной загрузки
|
||
|
||
Четыре контекста определяют, какие подсистемы инициализируются. Смотрите [Контексты начальной загрузки](bootstrap-contexts.md).
|
||
|
||
|Контекст|Используется для|
|
||
| ------- | -------- |
|
||
| `BootContext::Minimal` |Скрипты, которым нужны только пути / конфигурация|
|
||
| `BootContext::Cli` |Задания Cron и команды CLI|
|
||
| `BootContext::Stream` |Конечные точки потоковой передачи|
|
||
| `BootContext::Admin` |Панель администратора/реселлера|
|
||
|
||
---
|
||
|
||
## Варианты сборки (ОСНОВНАЯ и LB)
|
||
|
||
| |главный|фунт|
|
||
| --- | ---- | -- |
|
||
|Панель администратора|✅|❌|
|
||
|Потоковый|✅|✅|
|
||
|Модульная система|✅|подмножество|
|
||
|
||
Управляется перечислением `ServerEnvironment` и каждым полем `module.json` `environment`
|
||
(`main` / `lb` / `any`). At boot, `ModuleLoader::getCurrentEnvironment()` resolves the node's
|
||
окружение из константы `SERVER_TYPE` (`'lb'` → `ServerEnvironment::LoadBalancer`, иначе
|
||
`ServerEnvironment::Main`); модуль, у которого `environment` не соответствует узлу, пропускается, поэтому
|
||
LB получает **подмножество** модулей.
|
||
|
||
---
|
||
|
||
## Ключевые моменты расширения
|
||
|
||
|Механизм|Как использовать|
|
||
| --------- | ---------- |
|
||
|События PSR-14|`EventDispatcher::listen()` / `#[ListensTo]` — смотрите [Система событий](event-system.md)|
|
||
|Оформление сервиса|`$container->decorate('id', callable, priority)` — смотрите [Точки расширения модуля](module-extension-points.md#di-container-and-service-decoration)|
|
||
|Потоковое промежуточное программное обеспечение|Реализовать `StreamMiddlewareProviderInterface` — см. [Точки расширения модуля](module-extension-points.md#stream-middleware)|
|
||
|Записи Cron|`getCronEntries()` в классе module — смотрите [Точки расширения модуля](module-extension-points.md#cron-task)|
|
||
|Миграции баз данных|`MigratableInterface::getMigrations()` — смотрите [Точки расширения модуля](module-extension-points.md#versioned-migrations-migratableinterface)|
|
||
|
||
---
|
||
|
||
## Правила для участников
|
||
|
||
1. Модули не должны изменять основные файлы.
|
||
2. Никаких `eval`, исправлений ошибок или замены файлов во время выполнения.
|
||
3. Любой модуль можно отключить с помощью `config/modules.php`, не прикасаясь к ядру.
|
||
4. Защищенные сервисы (`db`, `settings`, `config`, `auth`) не могут быть оформлены.
|
||
5. Синхронизируйте документы EN и RU в одном и том же коммите.
|