se/bmecat
PHP/Laravel package for working with BMEcat, the XML format used to exchange electronic product catalog data. Read and write catalog documents containing products, prices, units, suppliers and classifications, making it easier to import or export procurement data in PHP applications.
Architecture fit. se/bmecat is a framework-agnostic PHP object model that serializes BMEcat product catalogs to XML — it is not a Laravel package in any meaningful sense (no service provider, facade, config publishing, or artisan command). That is a net positive: it belongs in the import/export adapter layer of a PIM, ERP, or marketplace domain, and it can be wrapped behind a narrow CatalogExporter port so the rest of the application never sees the library's API. BMEcat is a DACH-region B2B procurement standard (1.2 and 2005 variants), so the fit is strong only if the roadmap includes German/Austrian/Swiss distributor, marketplace, or supplier-onboarding flows.
Integration feasibility. Installable via Composer from Packagist, MIT licensed, with a small public API. The dominant technical risk is environment compatibility: the last release is January 2019, meaning the composer constraints almost certainly target PHP 7.x. Expect to fork and widen php constraints for PHP 8.1–8.3, then validate behavior (implicit nullable parameters, dynamic properties, strftime-class removals if used). Because the code surface appears thin — a set of catalog/product/feature builder classes plus an XML serializer — the fork cost is days, not weeks. That materially changes the make-vs-adopt calculus versus a large, complex dependency.
Technical risk.
T_UPDATE_PRODUCT, T_DELETE_PRODUCT), MIME_INFO attachments (datasheets, images), PRODUCT_REFERENCE, classification systems (eCl@ss, UNSPSC, ETIM), user-defined features, multilingual text, and price/scale handling may be partial or absent.libxml_disable_entity_loader/LIBXML_NONET) in any code path that also reads BMEcat, to avoid XXE.Key questions to resolve before commitment.
MIME_INFO, classification taxonomies, and user-defined features modelled?Stack fit. Any Laravel 9/10/11 application via Composer. Because the package touches no framework internals, it does not constrain our Laravel or PHP upgrade path — a rare benefit of an abandoned library with a small blast radius. Wrap it in an application service (BmecatCatalogExporter) registered in a service provider, invoked from a queued job, writing artifacts to object storage and delivering by signed download or SFTP to the partner.
Migration path (adopt-and-fork, not adopt-and-hope).
vcs Composer repository (or a private Satis/Repman mirror) at a tagged fork release; document the fork in the dependency register.Compatibility. Requires ext-dom/ext-libxml; no database, queue, or cache coupling. The only compatibility work is PHP language-level. Keep the fork's public API stable and add features (attachments, classification) as additive wrappers rather than editing generated serialization logic.
Sequencing. Spike and XSD validation → fork hardening and CI → adapter and queue wiring → pilot with one real buying portal → expand to additional distributors. Do not schedule the second supplier integration until the first has been accepted end-to-end; portal acceptance is the true gate, not schema validation. If the spike reveals missing transaction types or attachment support that would take more than ~10 engineer-days to add, fall back to generating XML from scratch against the XSD or via XSLT from an internal canonical model, and keep the DTOs.
Maintenance. Ownership transfers to us permanently. Budget roughly 3–5 engineer-days of initial fork hardening (PHP 8 compatibility, CI, tests, XSD fixtures) and 1–3 days per year thereafter, plus reactive work whenever a partner changes its dialect or the spec version moves. Add it to the third-party dependency register with an explicit annual review and a named owner; treat it as internal code, not a vendor dependency.
Support. No upstream, no issue tracker triage, no CVE feed. Mitigate by keeping the library isolated in the export adapter so a future replacement is a contained change, and by monitoring PHP/libxml CVEs generally rather than package-specific advisories.
Scaling. Generation is memory-bound and CPU-light. For catalogs beyond roughly 10k SKUs, expect multi-hundred-MB PHP memory ceilings and job runtimes measured in minutes. Mitigations, in order of preference: split output into multiple CATALOG documents per supplier contract, move generation to a dedicated worker queue with raised memory limits and generous timeouts, and only if necessary replace the serializer with a streaming XML writer behind the same adapter interface. Artifact storage and retention need a lifecycle policy — catalogs are large and often retained for audit.
Failure modes to instrument for.
Ramp-up. A mid-level PHP engineer is productive with the library's API in under a day; the real cost is BMEcat domain literacy — budget 2–4 days of spec reading plus partner-specific onboarding. Pair that with direct access to one pilot supplier's technical contact, since their acceptance criteria, not the specification, will define done. Overall recommendation: proceed with the spike and a controlled fork for a DACH catalog-export requirement, but do not expose the library's API beyond the adapter boundary — its value is a head start on a stable, slow-moving XML standard, and its cost is permanent, low-grade ownership.
How can I help you explore Laravel packages today?