faustddd/symfony-1c-import
Symfony package for importing 1C data into PHP applications. Configurable commands and mappings help sync products, categories, prices, and stock from CommerceML/XML feeds, simplifying catalog updates and reducing manual integration work.
Architecture fit. faustddd/symfony-1c-import is a Symfony bundle, not a Laravel package. It ships as a bundle with a DI extension, bundle configuration tree, console commands, and Messenger-based workers — all of which are Symfony Kernel constructs. The domain logic (CommerceML parsing, catalog/offer import, exchange authorization, ZIP/XML handling) is reusable in principle, but the packaging assumes a Symfony application. For a Laravel codebase this is an adjacent-ecosystem dependency, not a drop-in.
Integration feasibility. Partial and conditional. The v2.0.0 work that matters most for a Laravel consumer is the decoupling of processing logic from the framework: CatalogImporter/OffersImporter are now explicitly meant to be extended, and CustomImporter provides an extension point for additional XML payloads. That is a meaningful step toward framework-agnostic use — if those classes are plain services with constructor-injected dependencies rather than container-coupled ones. Streaming via XMLReader also removes the memory ceiling that would otherwise rule this out for large 1C exports. The blocker is whether the importers can be constructed outside a Symfony container without pulling in HttpKernel, DependencyInjection, or EventDispatcher in a way that forces us to install the Symfony skeleton alongside Laravel. This must be verified by reading composer.json and the importer constructors before committing.
Technical risk.
ext-xmlreader, ext-simplexml, ext-zip, PHP 8.2+. Verify all three against our production and CI images.Key questions.
CatalogImporter/OffersImporter be instantiated and driven without booting a Symfony kernel, or do they require KernelInterface, bundle config, and event dispatch?Stack fit. Honest read: this is a low fit as packaged and a moderate fit as a set of parsers. The CommerceML domain logic is the valuable asset; the Symfony bundle scaffolding is friction. The recommended posture is to treat the package as a reference implementation and parser library, not as an installed dependency of the Laravel application — unless a spike proves the importers are container-free.
Migration path. Two viable routes, in order of preference:
CustomImporter subclasses in the Laravel container. Cost: a thin adapter layer plus an explicit pin on the Symfony component versions we transitively pull in.XMLReader streaming logic and CommerceML model mapping into our own app/Imports/CommerceML namespace, keeping the package as a pinned reference in a dev dependency. Higher upfront cost, zero ongoing framework-conflict risk, and we retain the ability to track upstream changes by diff.Avoid the anti-pattern of installing the full Symfony framework bundle inside Laravel to satisfy the bundle's boot requirements — that creates two coexisting kernels and a genuinely bad debugging story.
Compatibility. Pin to ^2.0. Confirm PHP 8.2+ is our floor (it likely is for a current Laravel), and confirm the required extensions in composer.json platform requirements, Dockerfile, and CI matrix. Note that Symfony 8.x support signals active forward maintenance, which is a positive signal. Verify the package's transitive Symfony component constraints do not conflict with anything Laravel already pulls.
Sequencing.
composer.json, attempt a bare instantiation of CatalogImporter outside Symfony. This single result decides route 1 vs. route 2.CatalogImporter subclass that persists a single product type into our schema. Validate against a real 1C export.Maintenance. The heaviest ongoing cost is the adapter seam, not the package. Every Symfony component bump and every 1C schema quirk lands on whoever owns that seam. Budget for a named owner. Also budget for periodically diffing upstream — a single-maintainer package can go quiet without notice, and our fork/route-2 copy becomes the de facto source of truth if it does.
Support. No commercial support. Documentation improved substantially in this release — architecture, streaming parsing, handlers, security, production deployment, Messenger workers, file cleanup — which is a genuine and uncommon positive for a package of this size, and materially lowers onboarding cost. Treat the docs as the primary support channel and mirror the deployment/security guidance internally rather than relying on maintainer responsiveness.
Scaling. The XMLReader streaming rewrite is the headline operational win: memory stays roughly flat in document size instead of scaling with it. That is the difference between "works on a demo export" and "works on a full 1C catalog." Two caveats: streaming does not reduce wall-clock time on large imports, so long-running jobs still need chunking and checkpointing; and the write path into our own database — which we own entirely — will become the throughput bottleneck once parsing stops being one. Plan for batched upserts and a resumable cursor. ZIP extraction adds a second resource axis (temporary disk), so size the temp volume and set a cleanup policy explicitly.
Failure modes.
Ramp-up. Documentation quality makes the domain learning curve manageable for an engineer with CommerceML context. The Laravel-to-Symfony translation is the actual ramp-up cost, and it is non-obvious, undocumented, and specific to our stack — assign it to someone with both frameworks rather than someone learning either. Expect roughly a week of ramp-up before the first meaningful integration attempt, contingent on the spike outcome; if the spike fails and we go route 2, that shifts to a multi-week extraction effort.
How can I help you explore Laravel packages today?