Search by

faustddd / symfony-1c-import

FAUSTddd

Symfony bundle for CommerceML (1C) catalog exchange

Package info

github.com/FAUSTddd/symfony-1c-import

Type:symfony-bundle

pkg:composer/faustddd/symfony-1c-import

Statistics

Installs: 2

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

v2.0.0 2026-10-11 20:40 UTC

This package is auto-updated.

Last update: 2026-10-11 20:49:11 UTC


README

Tests PHP Version Symfony Version License: MIT

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/:

Тестирование

composer install
vendor/bin/phpunit

Лицензия

Распространяется под лицензией MIT. Подробнее см. в файле LICENSE.