> For the complete documentation index, see [llms.txt](https://docs.johncms.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.johncms.com/moduli/struktura-modulya.md).

# Структура модуля

Модули располагаются в папке **modules**.

Начиная с версии **9.9** рекомендуется использовать слоистую структуру модуля, при которой код разделён по слоям (Application, Domain, Infrastructure). Такая структура упрощает поддержку и рефакторинг больших модулей.

{% hint style="info" %}
Старая структура (папки `Controllers`, `templates`, `locale` прямо в корне модуля) по-прежнему работает и остаётся полностью совместимой. Но для новых модулей рекомендуется использовать новую слоистую структуру, описанную ниже.
{% endhint %}

Обычно модуль для JohnCMS 9.9 имеет следующую структуру:

* modules
  * module\_name
    * config
    * locale
    * src
      * Application
      * Domain
      * Infrastructure
      * Install
    * templates

Данная структура носит рекомендательный характер и не является обязательной.\
Система не накладывает ограничений на разработчика, и разработчик вправе использовать свою структуру модуля, которая для него будет удобнее.

Давайте подробнее посмотрим на структуру и разберёмся, что и для чего предназначено.

* **modules** — это обычная системная папка с модулями.
  * **module\_name** — это папка с названием модуля (например forum, community и т.п.).
    * **config** — конфигурация модуля: маршруты (`routes.php`) и регистрация сервисов в контейнере (`services.php`).
    * **locale** — папка, в которой хранятся файлы локализации модуля. Если модуль мультиязычный, то эта папка обычно есть.
    * **src** — исходный код модуля, разделённый по слоям.
      * **Application** — прикладной слой: контроллеры (`Controllers`), сценарии использования (`UseCases`), объекты передачи данных (`DTO`), сервисы (`Services`), middleware (`Middlewares`), консольные команды (`Console`), исключения (`Exceptions`).
      * **Domain** — доменный слой: модели (`Models`), контракты репозиториев (`Repository`), сущности (`Entities`), перечисления (`Enums`).
      * **Infrastructure** — инфраструктурный слой: реализации репозиториев и работа с хранилищем данных (`Persistence/Repository`, `Persistence/Models`).
      * **Install** — папка с установочными файлами (например `Installer.php`).
    * **templates** — в этой папке хранятся шаблоны модуля.

{% hint style="info" %}
Вложенные папки внутри `src` (например `Controllers`, `UseCases`, `Repository`) создаются по мере необходимости — только когда в них появляется первый класс. Заранее создавать все папки не нужно.
{% endhint %}

Директория `src` внутри модуля используется как пространство имён для автоматической загрузки классов (PSR-4). Пространство имён регистрируется в `composer.json`, например:

```json
"Johncms\\Modules\\ModuleName\\": "modules/module_name/src/"
```

После регистрации пространства имён нужно обновить карту автозагрузки, выполнив команду:

```bash
composer dump-autoload
```
