faustddd / symfony-1c-import
Symfony bundle for CommerceML (1C) catalog exchange
Package info
github.com/FAUSTddd/symfony-1c-import
Type:symfony-bundle
pkg:composer/faustddd/symfony-1c-import
Requires
- php: >=8.2
- ext-simplexml: *
- ext-xmlreader: *
- ext-zip: *
- symfony/config: ^6.4|^7.0|^8.0
- symfony/dependency-injection: ^6.4|^7.0|^8.0
- symfony/filesystem: ^6.4|^7.0|^8.0
- symfony/framework-bundle: ^6.4|^7.0|^8.0
- symfony/messenger: ^6.4|^7.0|^8.0
- symfony/routing: ^6.4|^7.0|^8.0
- symfony/yaml: ^6.4|^7.0|^8.0
Requires (Dev)
- phpunit/phpunit: ^10.0
Suggests
None
Provides
None
Conflicts
None
Replaces
None
README
Symfony-бандл для реализации HTTP-протокола обмена CommerceML 2 с 1С:Предприятие.
Обеспечивает приём файлов обмена, потоковый разбор XML с помощью XMLReader и передачу задач импорта в Symfony Messenger. Бизнес-логика создания и обновления товаров реализуется в приложении с использованием расширяемых обработчиков.
Возможности
- Полная реализация протокола 1С: поддержка всех фаз обмена (
checkauth,init,file,import). - Потоковый парсинг больших файлов: сервис
XmlStreamHelperна базеXMLReaderчитает XML последовательно, не загружая весь документ целиком в память, что существенно снижает пиковое потребление RAM при обработке тяжелых файлов. - Поддержка асинхронной обработки: при настройке асинхронного транспорта в Symfony Messenger контроллер отвечает 1С
successсразу после постановки задач в очередь; при синхронной шине обработка выполняется в рамках текущего HTTP-запроса. - Расширяемые обработчики: базовые сервисы
CatalogImporter,OffersImporterиCustomImporterдля реализации прикладной логики сохранения каталога, цен и остатков. - Безопасность из коробки: встроенная защита от Path Traversal, Zip Slip при распаковке архивов, валидация путей и снижение риска timing-атак при сравнении учётных данных.
- Управление зависимостями выгрузок: упорядоченный диспатч команд в шину сообщений (
import.xmlпередoffers.xml).
Требования
| Компонент | Версия |
|---|---|
| PHP | >= 8.2 (протестировано на 8.2, 8.3, 8.4) |
| Расширения PHP | ext-xmlreader, ext-simplexml, ext-zip |
| Symfony | 6.4.*, 7.x.*, 8.0.* |
Установка
composer require faustddd/symfony-1c-import
Если Symfony Flex не подключил бандл автоматически, добавьте его в config/bundles.php:
return [ // ... FaustDDD\Symfony1cImport\Symfony1cImportBundle::class => ['all' => true], ];
Конфигурация
Создайте файл конфигурации config/packages/faustddd_1c_import.yaml:
faustddd_1c_import: # URL эндпоинта для указания в настройках узла обмена 1C endpoint: '/1c/exchange' # Учетные данные для Basic Auth / GET параметров 1С login: '%env(IMPORT_1C_LOGIN)%' password: '%env(IMPORT_1C_PASSWORD)%'
Добавьте параметры авторизации в .env / .env.local:
IMPORT_1C_LOGIN=cml_exchange_user IMPORT_1C_PASSWORD=strong_random_password
Настройка асинхронной очереди (Symfony Messenger)
Для изоляции фоновой обработки импорта от веб-сервера направьте команды бандла в асинхронный транспорт (Redis, RabbitMQ, Doctrine и др.):
Базовый пример (любой асинхронный транспорт)
# config/packages/messenger.yaml framework: messenger: transports: async_import: dsn: '%env(MESSENGER_TRANSPORT_DSN)%' retry_strategy: max_retries: 3 delay: 2000 multiplier: 2 routing: 'FaustDDD\Symfony1cImport\Application\Command\ImportCatalogCommand': async_import 'FaustDDD\Symfony1cImport\Application\Command\ImportOffersCommand': async_import 'FaustDDD\Symfony1cImport\Application\Command\ImportCustomCommand': async_import
Redis и RabbitMQ: Подробные примеры конфигурации с Redis Streams и RabbitMQ AMQP, а также организация Shared Storage между контейнерами вынесены в Документацию по очередям и обработчикам.
Быстрый старт: реализация обработчиков
Бандл предоставляет расширяемые базовые хендлеры сообщений:
1. Импорт товаров и категорий (import.xml)
namespace App\Infrastructure\Cml; use FaustDDD\Symfony1cImport\Application\Service\CatalogImporter; use SimpleXMLElement; use Symfony\Component\Messenger\Attribute\AsMessageHandler; #[AsMessageHandler] final class MyCatalogImporter extends CatalogImporter { protected function handleProduct(SimpleXMLElement $item): void { $externalId = (string) $item->Ид; $name = (string) $item->Наименование; $article = (string) $item->Артикул; // Ваша доменная логика сохранения / обновления товара } }
2. Импорт цен и остатков (offers.xml)
namespace App\Infrastructure\Cml; use FaustDDD\Symfony1cImport\Application\Service\OffersImporter; use SimpleXMLElement; use Symfony\Component\Messenger\Attribute\AsMessageHandler; #[AsMessageHandler] final class MyOffersImporter extends OffersImporter { protected function handleOffer(SimpleXMLElement $item): void { $offerId = (string) $item->Ид; $quantity = (float) $item->Количество; // Ваша доменная логика обновления остатков и цен } }
Документация
Подробная архитектурная и прикладная документация доступна в каталоге docs/:
- Архитектура и жизненный цикл протокола
- Потоковый парсер XmlStreamHelper
- Очереди, обработчики и безопасность
- Production развертывание и обслуживание
Тестирование
composer install vendor/bin/phpunit
Лицензия
Распространяется под лицензией MIT. Подробнее см. в файле LICENSE.