Skip to content

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

@biz87

Description

@biz87

Описание

Система роутинга MiniShop3 сейчас поддерживает кастомизацию через два файла:

  • core/config/ms3_routes_web.custom.php
  • core/config/ms3_routes_manager.custom.php

Этот подход работает для ручной кастомизации одним разработчиком, но не подходит для сторонних компонентов — если два аддона хотят добавить свои роуты, они оба пишут в один файл, что создаёт конфликты при установке и удалении.

Решение

Добавить модульную загрузку роутов из директории core/config/ms3.routes.d/ — по аналогии с уже работающим ms3.services.d/ для сервисов.

Структура

core/config/ms3.routes.d/
  web/
    50-mydelivery.php      ← Web API роуты аддона
  manager/
    50-mydelivery.php      ← Manager API роуты аддона

Порядок загрузки роутов

  1. Системные роуты (config/routes/web.php / config/routes/manager.php)
  2. Пользовательские роуты (ms3_routes_web.custom.php / ms3_routes_manager.custom.php)
  3. NEW: Аддон-роуты из ms3.routes.d/web/*.php / ms3.routes.d/manager/*.php (в алфавитном порядке)
  4. build() dispatcher

Каждый следующий уровень может переопределять роуты предыдущего (через ключ METHOD:PATTERN).

Пример файла аддона

<?php
// core/config/ms3.routes.d/web/50-mydelivery.php
// Доступны: $router, $modx

use MiniShop3\Router\Response;
use MiniShop3\Middleware\TokenMiddleware;

$router->group('/api/v1/delivery/mydelivery', function($router) use ($modx) {
    $router->post('/calculate', function($params) use ($modx) {
        return Response::success(['cost' => 500]);
    });
    $router->get('/points', function($params) use ($modx) {
        return Response::success(['points' => []]);
    });
}, [new TokenMiddleware($modx)]);

Что нужно сделать

  • Добавить метод loadRoutesFromDirectory(string $dir) в Router
  • Вызвать загрузку из ms3.routes.d/web/ в api.php (после custom routes, до build())
  • Вызвать загрузку из ms3.routes.d/manager/ в Processors\Api\Router.php (аналогично)
  • Создать директории ms3.routes.d/web/ и ms3.routes.d/manager/ через resolver при установке
  • Добавить example-файл для документации
  • Обновить CHANGELOG.md

Преимущества

  • Консистентность — паттерн *.d/ уже используется для ms3.services.d/
  • Изоляция — каждый аддон в своём файле, install/uninstall атомарный
  • Нет конфликтов — несколько аддонов не пересекаются
  • Простота — минимум изменений в ядре (~30 строк)
  • Дебаг — файлы видны в ФС, легко проверить что загружено

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions