Files
XC_VM/docs/ru/development/autoloader.md
T
Divarion_D dbf535bcc5 docs(translate): robust {N} sentinels + possessive handling; regenerate ru
Fix Markdown-mangling artifacts the free web engine (yandex) produced in the
committed docs/ru, and regenerate the whole tree cleanly (0 fallbacks):

- Sentinel format @@N@@ -> {N}. MT engines are trained to preserve curly
  format-string placeholders, so {N} survives code-heavy lines where @@N@@ (and
  ZZZ…ZZZ, which also duplicated its Z) were split/moved — e.g. the stray
  "@0@@" in the FAQ and "load balancerZ" in the README are gone.
- Possessive: a trailing English `'s` is consumed INTO the masked span and
  dropped on restore. Every sentinel format breaks when a bare `'s` sits right
  after it, and Russian has no possessive `'s`.
- Validate + retry: after restore, any leftover brace fragment triggers a retry
  (the engine is non-deterministic); after a few failures the line stays English
  so a broken token is never emitted.
- Glossary += KeyDB, yt-dlp, Ubuntu, iptables, MAGSCAN.

Regenerated docs/ru (37 files, translators/yandex): no residual sentinels,
mkdocs build --strict clean.
2026-08-21 16:31:01 +03:00

6.6 KiB
Raw Blame History

Автоматическая загрузка (PSR-4)

XC_VM автоматически загружает классы с помощью стандартного Composer PSR-4 автозагрузчика; в пространстве имен кодируется путь к файлу, поэтому разрешение выполняется напрямую file_exists без сканирования и кэширования.


Обзор

Каждый сторонний класс находится в корневом пространстве имен XcVm\, сопоставленном с src/:

XcVm\Core\Auth\Authenticator   ->  src/Core/Auth/Authenticator.php
XcVm\Domain\Stream\StreamService ->  src/Domain/Stream/StreamService.php
XcVm\Public\Controllers\Admin\UserController -> src/Public/Controllers/Admin/UserController.php

Отображение объявлено в src/composer.json:

"autoload": {
    "psr-4": {
        "XcVm\\": "./",
        "M3uParser\\": "Core/Parsing/M3uParser/src/",
        "Chrisyue\\PhpM3u8\\": "Core/Parsing/PhpM3u8/src/"
    }
}

src/vendor/ (автозагрузчик Composer + производственные зависимости) зафиксирован и отправлено — путь развертывания не содержит Composer и никогда не выполняется composer install. Там нет ли ** кэша карты классов ** (нет optimize-autoloader): пропущенный класс - это простой путь поиск, а не повторное сканирование каталога.

Добавление нового класса

Создайте файл по пути, соответствующему его пространству имен, — вот и все; Composer разрешает его по требованию:

// src/Domain/Billing/InvoiceService.php
namespace XcVm\Domain\Billing;

class InvoiceService {
    public static function generate(int $userId): string { /* ... */ }
}

Ссылайтесь на него из другого кода в пространстве имен с помощью импорта use или по его полному номеру:

use XcVm\Domain\Billing\InvoiceService;

Не нужно очищать кэш, редактировать реестр. Совершенно новое подпространство имен (например, XcVm\Domain\Billing) срабатывает немедленно, поскольку он отображается прямо на каталог.

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

Правило Пример
Имя файла **должно ** совпадать с именем класса InvoiceService.php → class InvoiceService
Один класс на файл PSR-4 разрешает один класс для каждого пути; разбивает файлы нескольких классов
Пространство имен должно совпадать с путем к каталогу (с учетом регистра) src/Domain/Billing/ → namespace XcVm\Domain\Billing;
Классы и каталоги PascalCase StreamService, DatabaseHandler, Core/Auth/
Соглашение о проекте: нет declare(strict_types=1) —

Поскольку пространство имен содержит местоположение, дублируйте короткие имена в разных пространства имен больше не конфликтуют — XcVm\Public\Controllers\Admin\PlexController и XcVm\Module\Plex\PlexController различны.

Процедурные файлы и файлы третьих лиц

Некоторые файлы намеренно не разделены пространством имен и загружаются явным образом. require, а не автозагрузчик:

  • процедурные точки входа, представления и загрузочный клей (например, Public/index.php, Public/Views/**, Infrastructure/Bootstrap/*.php);
  • глобальные константы и функции (Core/Config/*, обработчик ошибок);
  • класс ioncube XC_VM и комплект поставки Infrastructure/Tmdb/lib/*.

Пакеты, поставляемые поставщиками M3uParser и Chrisyue\PhpM3u8, имеют свои собственные PSR-4 префиксы (указанные выше) и автозагрузка выполняются в обычном режиме.

Модули

Классы модулей используют пространство имен XcVm\Module\<Name>\…, но не зарегистрированы в composer.json (каталоги модулей/торговых площадок — plex, watch-d2bho — не соответствуют ни одному правилу PSR-4). Они разрешаются с помощью ModuleLoader собственных PSR-4 распознаватель: он удаляет базовое пространство имен модуля и отображает оставшееся в вложенный путь в каталоге модуля. Смотрите Модульная система.

Инструменты для разработки

Зафиксированное значение vendor/ доступно только для рабочей среды. PHPStan и PHP-CS-Fixer являются require-dev пакеты — установите их локально с помощью:

make dev-tools   # = cd src && composer install

Они никогда не фиксируются (CI-шлюз обеспечивает фиксацию поставщика только для продукта). Видеть Рабочий процесс разработки.

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

Файл Роль
src/composer.json PSR-4 префиксная карта + зависимости
src/composer.lock зафиксированная блокировка для воспроизводимого composer install
src/vendor/ зафиксированный Composer автозагрузчик + производственные удаления
src/bootstrap.php определяет MAIN_HOME, требует vendor/autoload.php
src/Core/Module/ModuleLoader.php PSR-4 преобразователь для классов модулей