3.9 KiB
3.9 KiB
title
| title |
|---|
| Генерация XML-фида для Яндекса (Backend) |
Сценарий 4.3: XML-фиды (Яндекс)
Бизнес-цель
Сгенерировать YML/XML фид для рекламных / информационных площадок (исторически Яндекс): в фид попадают врачи, клиники/услуги, цены, тексты и URL с UTM-метками.
Точки входа
| Тип | Метод + URL | Класс |
|---|---|---|
| HTTP | GET /xml/feed |
XmlFeedController::generateFeed |
| HTTP | GET /xml/feed/v1 |
XmlFeedController::generateFeedV1 — выбор филиалов по filials (csv fid) или по regionId |
Для /xml/feed: query-параметр filial — числовой fid; поддерживаются UTM-поля.
Пошаговый алгоритм (generateFeed)
FilialRepository::findOneBy(['fid' => filialId])— если филиал не найден, контроллер возвращает пустойResponse(HTTP 200 без тела) — в коде нет явного статуса ошибки.- Собираются UTM-параметры в массив (utm_source, utm_medium, utm_campaign, ...).
XmlFeedGeneratorService::generateFeed($filial, $utmParams)строитDOMDocument:addShopInfo— метаданные магазина/сети;addDoctors— врачи филиала (SpecialistService::getListс фильтромactive=true,filial=fid);addClinics,addServices,addOffers— прайс и структура услуг черезPriceListService, отделения черезDepartmentService, локации черезLocationService, филиалы черезFilialService, тексты dcode черезSpecialistDcodeDescriptionRepository.
- Контроллер возвращает
ResponseсContent-Type: application/xmlи теломsaveXML().
Версия V1 использует XmlFeedGeneratorV1Service — та же идея, другой шаблон дерева XML (см. класс).
Mermaid
flowchart TD
C[GET /xml/feed?filial=...] --> F{Филиал найден?}
F -->|нет| E404[Пустой Response 200]
F -->|да| X[XmlFeedGeneratorService.generateFeed]
X --> D[SpecialistService.getList]
X --> P[PriceListService.getList]
X --> L[LocationService / DepartmentService]
X --> DOM[DOMDocument saveXML]
DOM --> R[Response XML]
Внешние зависимости
| Система | Роль |
|---|---|
| PostgreSQL | все справочники и врачи |
| Инфоклиника / Bitrix | не вызываются при генерации |
| Redis | не используется |
Обработка ошибок и edge cases
- Пустой/неверный
filial— пустой ответ200без XML (так задумано в текущем контроллере). - Большой XML — генерация синхронна; долгие запросы на проде стоит кешировать на уровне nginx/CDN или вынести в задачу.
- Пустые списки врачей/цен — фид всё равно строится, но может не пройти требования площадки — нужна валидация бизнес-правил.
Ссылки на классы
apps/backend/src/Controller/XmlFeedController.phpapps/backend/src/Service/XmlFeedGenerator/XmlFeedGeneratorService.phpapps/backend/src/Service/XmlFeedGenerator/XmlFeedGeneratorV1Service.phpapps/backend/src/Service/Specialist/SpecialistService.phpapps/backend/src/Service/PriceList/PriceListService.php