Отвечает за весь жизненный цикл обмена данными с 1С по протоколу CommerceML:
- приём файлов
import.xml/offers.xml - парсинг и сохранение каталога, остатков, цен
- фоновая или синхронная обработка
src/Import/
│
├─ Application/ ← сценарии (use-cases)
│ ├─ Command/
│ │ └─ ImportCatalogCommand.php → DTO «импортируй этот XML»
│ │
│ └─ Service/
│ ├─ Cml1cInteractor.php → «разговаривает» с 1С (checkauth/init/file/import)
│ └─ CatalogImporter.php → парсит XML и пишет в БД (handler команды)
│
├─ Domain/ ← чистая предметная область (без зависимостей)
│ └─ Cml/
│ ├─ CmlFile.php → value-object «файл CommerceML»
│ └─ CmlMode.php → enum режимов 1С (checkauth/init/file/import)
│
└─ Infrastructure/ → адаптеры «наружу»
└─ Controller/
└─ Import1CController.php → маршрут /1c/exchange, делегирует Cml1cInteractor
-
1С делает HTTP-запрос
GET /1c/exchange?type=catalog&mode=checkauth -
Infrastructure / Controller
Import1CControllerсоздаётRequestи вызывает сервис приложенияCml1cInteractor -
Application / Service / Cml1cInteractor
- превращает
?mode=вenum CmlMode - для
checkauth/initсразу возвращает текст-ответ - для
fileсохраняет тело запроса вvar/import/ - для
importсоздаётImportCatalogCommandи кидает её в шину (MessageBus)
- превращает
-
MessageBus (Symfony Messenger)
- может быть синхронным (обрабатывается мгновенно)
- или асинхронным (Redis/RabbitMQ) — 1С сразу получит
success, а импорт пойдёт в фоне
-
Application / Service / CatalogImporter (handler команды)
- читает XML через
simplexml - маппит узлы в сущности (
Product,Category,Manufacturer…) - сохраняет через
EntityManager
- читает XML через
-
Domain / Cml / …
CmlMode— native PHP-enumCmlFile— value-object без зависимостей
→ легко тестировать unit-тестами, не требует Symfony
# очередь обрабатывается синхронно (по-умолчанию)
php bin/console messenger:consume async
# если переделали под async (Redis/Rabbit)
php bin/console messenger:consume async --time-limit=3600