dragon-code/xml-core
A lightweight XML core for Laravel and PHP that provides a simple, fluent API for building, parsing, and validating XML documents. It supports attributes, namespaces, and CDATA, helping you generate structured XML responses and handle common XML tasks without verbose boilerplate.
Architecture fit. The prior assessment's central architectural claim — that dragon-code/xml-core is a foundation package with no Laravel surface — is now partly falsified and must be re-tested. "Added Laravel 12 support" (#32) implies the package maintains a Laravel-facing integration path, whether that is a service provider, a config surface, or merely a CI matrix that runs against laravel/framework ^12.0. Those are materially different things and the release note does not distinguish them. The distinction matters: a CI matrix is a compatibility promise, a service provider is a framework dependency we would inherit. Until the source is inspected, treat the architecture-fit finding as unresolved rather than negative. What has not changed is the underlying positioning: the package still sits below the problem that Laravel applications actually have (sitemaps, feeds, SOAP, UBL), and XMLWriter, symfony/xml, and sabre/xml remain closer to that problem and better documented.
Integration feasibility. Unchanged mechanically — Composer require, PSR-4, no framework coupling to fight. The feasibility questions that were open are partly answered and partly still open. Answered: the package is being actively released against current Laravel (12 ships in 2025), so the PHP constraint is at least not frozen at PHP 8.1. Still open: whether Laravel 12 support means the constraint was widened or the test matrix expanded, whether ext-dom/ext-simplexml/ext-libxml are required, and whether sibling dragon-code/* packages are pulled in.
Technical risk. The risk profile has improved but not to an adoptable level:
ext-dom and Symfony occupying it.Key questions — revised.
src/ and composer.json extra.laravel.dragon-code/xml-core in transitively? If yes, this stays a supply-chain observation.XMLWriter + a 40-line builder, or symfony/xml, does not? Get a concrete diff.composer.json PHP and extension constraints, and do they exclude our target runtime?Verdict. Changed from "do not adopt; tolerate as transitive" to "conditionally re-open, timeboxed." The hard blocker (archived, no upstream remedy) is lifted, which is the only finding a release note could have reversed. Everything else — zero adoption, one maintainer, unverified security posture, better-maintained alternatives — is untouched. Recommend a half-day spike, not an integration: confirm the archive is lifted and a maintenance commitment exists, read the source, and diff against symfony/xml on our actual fixtures. If the spike does not produce evidence of external usage or a security posture, close the evaluation at that point.
Stack fit. Materially better than assessed, conditional on what "Laravel 12 support" means. If a service provider exists, the package is Laravel-idiomatic and the "foreign abstraction layer" objection weakens considerably — we would inherit container bindings and config rather than write permanent glue. If it is only a CI matrix, the original objection stands and the wrapper is still ours to own. Resolve this before any design work; it is a five-minute source read.
Migration path. The prior guidance holds with one relaxation and one addition:
composer.lock and add a Dependabot/Renovate watch — but the "unmaintained — monitor" register entry should be downgraded to "low-adoption — monitor," not closed. Active maintenance does not make a zero-dependent package safe. Keep the one-file internal adapter (App\Support\Xml\BuilderInterface) regardless; it costs little and makes the swap a single class change.app/ — license attribution and version traceability objections are unchanged.Compatibility. Verify three things, same as before, but now with a live target: (a) the php constraint against our runtime and the next minor we plan to adopt — a Laravel 12 bump implies current PHP support, not future PHP support; (b) required extensions present in the production image, not just dev; (c) no transitive dragon-code/* siblings creating constraint conflicts. The key difference from the prior assessment: these are now live constraints the maintainer can widen on request, rather than frozen ones requiring a fork.
Sequencing.
composer why dragon-code/xml-core across all services; grep for direct imports. Establish whether this is already in the tree.XMLWriter, symfony/xml, and this package against identical fixtures. Expect alternatives to win on documentation and adoption; expect this package to be competitive on effort only if a service provider exists.Maintenance. The upstream burden is no longer zero-by-abandonment; it is now thin but present. That is a real improvement — a maintainer shipping Laravel 12 support is a maintainer who will likely ship Laravel 13 support. The residual risk is that this is a single burst of activity after dormancy rather than a sustained commitment, and one release is not enough history to tell the difference. Budget for periodic review either way; the difference is that remediation now has a plausible upstream path (issue, PR) instead of requiring a fork.
Support. Unchanged and still the weakest dimension. One maintainer, no documented security disclosure process, no co-maintainers. Active maintenance of a 2-star package typically means best-effort, not SLA. In an incident, "the XML library is doing something strange" still has a thin external escalation path. Verify whether SECURITY.md exists before relying on any upstream response for a vulnerability.
Scaling. Unchanged. XML serialization is CPU- and memory-bound and fails by memory exhaustion on large documents. Laravel 12 compatibility tells us nothing about whether it streams or builds full DOM trees. If our volumes are small (sitemaps, config export, per-request KB payloads), irrelevant. If we ever process large or batch XML, load-test before committing.
Failure modes, re-ranked.
Ramp-up. Unchanged in absolute terms — small codebase, narrow API, front-loaded into source reading rather than documentation. The organizational ramp-up issue is now mildly worse in one specific way: engineers who saw "archived" and engineers who see "actively released" will form opposite assumptions about the same package. The dependency-policy note must state the current facts and the date they were checked, not just a status label.
Bottom line for the product decision. The 2.4.0 release reverses the single disqualifying finding — the package is almost certainly no longer archived and now tracks current Laravel. That is enough to justify a half-day spike and not enough to justify adoption. The composite score of 0.005, zero dependents, and single-maintainer risk are untouched, and XMLWriter, symfony/xml, and sabre/xml remain better-documented and better-exercised. Recommend: verify unarchive status, run the spike, and default to the alternatives unless the spike produces concrete evidence this package does something they cannot. If it is already in the tree transitively, the deliverable is still an isolation adapter and a re-labelled monitoring entry.
How can I help you explore Laravel packages today?