2026-08-20 22:37:44 +03:00
# Автоматическая загрузка (PSR-4)
2026-08-27 18:07:43 +03:00
XC_VM автоматически загружает классы с помощью стандартного автозагрузчика **Composer PSR-4** ; пространство имен кодирует путь к файлу, поэтому разрешение выполняется напрямую `file_exists` без сканирования и кэширования.
2026-08-20 22:37:44 +03:00
---
## Обзор
2026-08-21 16:31:01 +03:00
Каждый сторонний класс находится в корневом пространстве имен `XcVm\` , сопоставленном с `src/` :
2026-08-20 22:37:44 +03:00
```text
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
```
2026-08-21 16:31:01 +03:00
Отображение объявлено в `src/composer.json` :
2026-08-20 22:37:44 +03:00
```json
"autoload" : {
"psr-4" : {
2026-08-27 18:07:43 +03:00
"XcVm\\" : "./"
2026-08-20 22:37:44 +03:00
}
}
```
2026-08-21 16:31:01 +03:00
`src/vendor/` (автозагрузчик Composer + производственные зависимости) зафиксирован и
2026-08-20 22:37:44 +03:00
отправлено — путь развертывания не содержит Composer и никогда не выполняется `composer install` . Там
2026-08-27 18:07:43 +03:00
is **нет кэша карт классов** (no `optimize-autoloader` ): пропуск класса - это простой путь
2026-08-20 22:37:44 +03:00
поиск, а не повторное сканирование каталога.
## Добавление нового класса
Создайте файл по пути, соответствующему его пространству имен, — вот и все; Composer разрешает его по требованию:
```php
// src/Domain/Billing/InvoiceService.php
namespace XcVm\Domain\Billing ;
class InvoiceService {
public static function generate ( int $userId ) : string { /* ... */ }
}
```
2026-08-21 16:31:01 +03:00
Ссылайтесь на него из другого кода в пространстве имен с помощью импорта `use` или по его полному номеру:
2026-08-20 22:37:44 +03:00
```php
use XcVm\Domain\Billing\InvoiceService ;
```
Не нужно очищать кэш, редактировать реестр. Совершенно новое подпространство имен (например,
2026-08-21 16:31:01 +03:00
`XcVm\Domain\Billing` ) срабатывает немедленно, поскольку он отображается прямо на
2026-08-20 22:37:44 +03:00
каталог.
## Правила присвоения имен
|Правило|Пример|
| --- | --- |
2026-08-27 18:07:43 +03:00
|Имя файла **должен** соответствует имени класса|`InvoiceService.php` → `class InvoiceService` |
2026-08-21 16:31:01 +03:00
|Один класс на файл|PSR-4 разрешает один класс для каждого пути; разбивает файлы нескольких классов|
2026-08-27 18:07:43 +03:00
|Пространство имен **должен** соответствует пути к каталогу (с учетом регистра).|`src/Domain/Billing/` → `namespace XcVm\Domain\Billing;` |
2026-08-20 22:37:44 +03:00
|Классы и каталоги PascalCase|`StreamService` , `DatabaseHandler` , `Core/Auth/` |
|Соглашение о проекте: нет `declare(strict_types=1)` |—|
Поскольку пространство имен содержит местоположение, дублируйте короткие имена в разных
пространства имен больше не конфликтуют — `XcVm\Public\Controllers\Admin\PlexController` и
`XcVm\Module\Plex\PlexController` различны.
## Процедурные файлы и файлы третьих лиц
2026-08-27 18:07:43 +03:00
Некоторые файлы намеренно разделены пространством имен **нет** и загружаются явным образом.
2026-08-20 22:37:44 +03:00
`require` , а не автозагрузчик:
- процедурные точки входа, представления и загрузочный клей (например, `Public/index.php` ,
`Public/Views/**` , `Infrastructure/Bootstrap/*.php` );
- глобальные константы и функции (`Core/Config/*` , обработчик ошибок);
2026-08-21 16:31:01 +03:00
- класс ioncube `XC_VM` и комплект поставки `Infrastructure/Tmdb/lib/*` .
2026-08-20 22:37:44 +03:00
2026-08-27 18:07:43 +03:00
Сторонние библиотеки (например, `gemorroj/m3u-parser` , `chrisyue/php-m3u8` ,
`mobiledetect/mobiledetectlib` , `geoip2/geoip2` ) являются обычными Composer `require`
зависимости, объявленные в `src/composer.json` ; они находятся в `src/vendor/` и
autoload through the Composer vendor autoloader — they are **not** listed in the
`psr-4` блок выше.
2026-08-20 22:37:44 +03:00
## Модули
2026-08-27 18:07:43 +03:00
Классы модулей используют пространство имен `XcVm\Module\<Name>\…` , но зарегистрированы в **нет**
2026-08-21 16:31:01 +03:00
в `composer.json` (каталоги модулей/торговых площадок — `plex` , `watch-d2bho` —
не соответствуют ни одному правилу PSR-4). Они разрешаются с помощью `ModuleLoader` собственных PSR-4
2026-08-20 22:37:44 +03:00
распознаватель: он удаляет базовое пространство имен модуля и отображает оставшееся в
2026-08-27 18:07:43 +03:00
дополнительный путь в каталоге модуля. Смотрите [Создание модуля ](module-authoring.md ).
2026-08-20 22:37:44 +03:00
## Инструменты для разработки
2026-08-21 21:56:31 +03:00
Зафиксированное значение `vendor/` доступно только для производства. PHPStan и phpcs являются
2026-08-21 16:31:01 +03:00
`require-dev` пакеты — установите их локально с помощью:
2026-08-20 22:37:44 +03:00
```bash
make dev-tools # = cd src && composer install
```
Они никогда не фиксируются (CI-шлюз обеспечивает фиксацию поставщика только для продукта). Видеть
[Рабочий процесс разработки ](../guides/dev-workflow.md ).
## Связанные файлы
|Файл|Роль|
| --- | --- |
| `src/composer.json` |PSR-4 префиксная карта + зависимости|
| `src/composer.lock` |зафиксированная блокировка для воспроизводимого `composer install` |
2026-08-21 16:31:01 +03:00
| `src/vendor/` |зафиксированный Composer автозагрузчик + производственные удаления|
2026-08-20 22:37:44 +03:00
| `src/bootstrap.php` |определяет `MAIN_HOME` , требует `vendor/autoload.php` |
2026-08-21 16:31:01 +03:00
| `src/Core/Module/ModuleLoader.php` |PSR-4 преобразователь для классов модулей|