October CMS · REST

Как бэкенду работать с этим API

Репозиторий отдаёт JSON четырём витринам. Тема CMS — заглушка. Ломать форму ответа нельзя.

Sandbox.Restapi api.corp.sotrans.ru

Что это за проект

October CMS 3 / Laravel 9, но продукт — не страницы CMS, а плагин Sandbox.Restapi. Фронты mz, truckland, bereit и piterbus ходят сюда за каталогом, меню, новостями, страницами и формами.

Прод: https://api.corp.sotrans.ru, админка /admin. Установка с нуля — в корневом SETUP.md.

Стек

Локальный запуск

  1. База — как в .env (DB_DATABASE=api_corp_sot). Удобно накатить прод-дамп, чтобы судить о данных.
  2. composer install, права на storage/ и bootstrap/cache/.
  3. Сервер: php artisan serve --host=192.168.11.129 --port=8888. С 127.0.0.1 в этой сети часто не достучаться.
  4. Проверка: GET /api/mz/catalog и главная /.
Тема demo Это заглушка лендинга API, не витрина. Четыре сайта её не рендерят. ACTIVE_THEME=demo в .env не меняйте без замены папки темы.

Четыре фронта

КодФронтСайт в админке
mzmz.sotrans.rumz.sotrans.ru
trucklandtruckland.rutruckland.ru
bereitbereit.sotrans.rubereit.ru
piterbuspbc-dev.sotrans.rupiterbus.com
itit.sotrans.ruit.sotrans.ru

Коды зашиты в routes.php (mz|truckland|bereit|piterbus|it) и в OctoClub\Tutorial\Classes\SiteResolver. Домен из роута в код: первое слово до точки.

Bereit /catalog/filtered и меню каталога отдают 500 и на проде: нет корня Shopaholic. Не «чините» это сменой контракта для остальных сайтов.

Где лежит код

ПутьЗачем
plugins/sandbox/restapi/routes.phpv1 /api/{site} и v2 /api/v2/{site}
Http/Controllers/Тонкие контроллеры
Services/Сборка ответа, меню, формы, sitemap
Http/Resources/Маппинг в DTO/массивы
swagger.json, swagger-v2.jsonСпека, её отдают роуты /swagger.json
plugins/sandbox/restapi/views/Swagger UI
docs/Инструкции (эта и соседние HTML)

Linux чувствителен к регистру. Каталоги Http и Services с большой буквы. Нижний регистр http/ / services/ уже удалён — не возвращайте дубли.

Сайт в URL

Контент режется по Tutorial Category / Shopaholic-корню, имя которых совпадает с доменом сайта. Резолв — SiteResolver::extractCode() и candidateNames(). Для piterbus предпочитаемый домен piterbus.com.

Новый сайт — это не только фронт: код в where роутов, Swagger enum, KNOWN_SITES, запись сайта в админке и корень каталога.

Как добавить метод

  1. Роут в routes.php. Если контракт старых витрин не должен меняться — только v2.
  2. Контроллер в Http/Controllers, логика в Services, не в маршруте.
  3. Поля ответа опишите в swagger.json / swagger-v2.json. UI читает эти файлы с Cache-Control: no-store.
  4. Проверьте все четыре кода сайта, не только mz.
  5. Сверьте HTTP-статусы с продом по Swagger GET (локальная база ≠ прод по телу).

Меню шапки: CatalogController::getHeaderTestMenuCatalog + MenuFormatter::formatTestHeaderMenu (дерево children / link). Не подменяйте плоским getHeaderMenuCatalog.

Swagger

Кроны и логи

Регистрация кронов — plugins/sandbox/restapi/Plugin.php → registerSchedule.

Плагины

Живые: Restapi, Tutorial, Shopaholic + Properties, News, Vacancy, Employees, Map, Seo, Services, RicheditorSnippets.

Отключённые в БД (is_disabled=1) могут остаться строками без файлов. Так и задумано: plugin:disable, не plugin:remove. Remove дропает таблицы.

Builder снят. DaData в composer есть, из API не вызывается — не выкидывать без отдельного решения.

Чего не делать

Чеклист перед мержем

  1. Четыре сайта, v1 и v2: статусы как на проде (кроме известных 500 Bereit).
  2. Меню шапки — дерево, фронт MZ его ест.
  3. Swagger v1 содержит header/footer menu, если трогали меню.
  4. Нет новых Log::info в контроллерах выдачи.
  5. Контентщикам Питербас по-прежнему хватает их инструкции.