Skip to content

feat(router): modular addon routes (ms3.routes.d)#171

Merged
biz87 merged 3 commits intobetafrom
feat/ms3-routes-d-169
Mar 28, 2026
Merged

feat(router): modular addon routes (ms3.routes.d)#171
biz87 merged 3 commits intobetafrom
feat/ms3-routes-d-169

Conversation

@Ibochkarev
Copy link
Copy Markdown
Member

@Ibochkarev Ibochkarev commented Mar 27, 2026

Описание

Модульная загрузка роутов аддонов из core/config/ms3.routes.d/web/ и core/config/ms3.routes.d/manager/ после системных (config/routes/*.php) и пользовательских (ms3_routes_*.custom.php) файлов, в алфавитном порядке *.php, до build() диспетчера. Переопределение маршрутов — по внутреннему ключу METHOD:PATTERN, как и для custom-файлов.

Добавлены Router::loadRoutesFromDirectory(), Router::coreAddonRoutesDirectory('manager'|'web') с проверкой аргумента. Web-фрагменты подключаются в api.php и Processors\Api\Index (кастомные фронты / Vue-менеджер). Processors\Api\Router (встроенная админка MODX) грузит только manager-цепочку, без web.php и без ms3.routes.d/web/. Resolver при установке создаёт каталоги ms3.routes.d/{web,manager} в core/config/. В пакете — example-addon.php.dist с пояснением про точки входа.

Цель: несколько сторонних компонентов могут добавлять роуты отдельными файлами без конфликтов в одном *.custom.php (см. обсуждение в issue).

Тип изменений

  • Исправление бага (non-breaking change)
  • Новая функциональность (non-breaking change)
  • Breaking change (изменение, ломающее обратную совместимость)
  • Рефакторинг (без изменения функциональности)
  • Документация
  • Другое (опишите):

Связанные Issues

Closes #169

Как это было протестировано?

Проверены только синтаксис PHP и логика при разработке; полное ручное прогонание connector и api.php с фрагментами в ms3.routes.d — перед мержем.

  • Ручное тестирование
  • Автоматические тесты (PHPStan, ESLint)
  • Тестирование на разных версиях PHP/MODX

Конфигурация тестирования:

  • MiniShop3: ветка PR
  • MODX: —
  • PHP: —

Скриншоты (если применимо)

До После

Изменения затрагивают конфигурацию роутинга и ФС, UI не меняется.

Чеклист

  • Код соответствует стилю проекта
  • Добавлены/обновлены комментарии в сложных местах
  • Изменения не ломают существующую функциональность
  • Лексиконы добавлены на двух языках (ru/en) — не применимо, лексиконы не менялись
  • PHPStan проходит без новых ошибок
  • ESLint проходит без ошибок (для JS/Vue изменений) — не применимо, JS/Vue не менялись
  • Обновлён CHANGELOG.md (для значимых изменений)

Дополнительные заметки

  • Паттерн согласован с существующим ms3.services.d/.
  • Файлы в ms3.routes.d/ исполняются как PHP — тот же уровень доверия, что и ms3_routes_*.custom.php.

- Router::loadRoutesFromDirectory() + coreAddonRoutesDirectory()
- Load in api.php, Api\Index, Api\Router; aligned connector processors
- Resolver creates ms3.routes.d/{web,manager}; example .dist files
- CHANGELOG
@Ibochkarev Ibochkarev marked this pull request as ready for review March 27, 2026 16:02
@Ibochkarev Ibochkarev requested a review from biz87 March 27, 2026 16:02
@ShevArtV
Copy link
Copy Markdown

Хорошая фича, паттерн .d/ — правильный подход для модульных аддонов. Код чистый, обработка ошибок продуманная. Есть замечания:

1. Processors/Api/Router.php — лишняя загрузка web.php и ms3.routes.d/web/

Router.php — процессор для встроенной админки MODX (с проверкой сессии менеджера). Web-роуты (корзина, заказы покупателя) там не нужны и раньше намеренно не грузились. Это отдельная точка входа от Index.php, который предназначен для кастомных фронтов/админок.

Предлагаю убрать из Router.php:

// убрать
$router->loadRoutes($webRoutesFile);
// убрать
$router->loadRoutesFromDirectory(ApiRouter::coreAddonRoutesDirectory('web'));

2. Документация в .dist — неочевидное поведение с web/

Файл из ms3.routes.d/web/ загружается и на фронте (api.php), и в менеджере (Index.php). Это может удивить разработчика аддона — стоит явно предупредить в примерах, что web-роуты видны обоим входным точкам.

3. Мелочь — coreAddonRoutesDirectory() без валидации

Метод принимает произвольную строку. Сейчас вызывается только с 'web'/'manager', но как публичный static API было бы надёжнее добавить whitelist допустимых значений.

- Processors\Api\Router: drop web.php and ms3.routes.d/web (built-in manager)
- coreAddonRoutesDirectory: whitelist manager|web
- Document dual entry for web fragments (.dist, routes headers, class docblocks)
- CHANGELOG: correct connector behavior per review
@Ibochkarev Ibochkarev requested a review from ShevArtV March 28, 2026 06:32
@biz87 biz87 merged commit a9b0329 into beta Mar 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: Модульная регистрация роутов для аддонов (ms3.routes.d)

3 participants