laminas/laminas-xmlrpc
Laminas XML-RPC provides a complete PHP implementation of the XML-RPC protocol, including both client and server support for encoding, decoding, and dispatching remote procedure calls.
Architecture fit
laminas/laminas-xmlrpc is a protocol library, not a framework integration. It ships an XML-RPC client, an XML-RPC server, value objects for type marshalling (struct, array, date, base64, boolean), and fault/exception types. There is no Laravel service provider, facade, config file, or publishable assets — every touchpoint with the Laravel container is something we would own.laminas-http dependency is the single most important architectural fact for us: transport is now decoupled, so the client side can plausibly be bridged onto Illuminate\Support\Facades\Http or Guzzle rather than dragging in the Laminas HTTP stack. This is what makes the package usable in a non-Laminas codebase, but it also means the wiring is on us and the README does not describe it.Integration feasibility
Technical risk
LIBXML_* flag passthrough, which is our mitigation hook — but it is opt-in. Non-negotiable: LIBXML_NONET, entity loading disabled, hard request-size and depth caps at the web server and middleware layers, and a PHP extension audit. This must be an explicit review gate, not a default.system.listMethods and friends are enabled by default; that is a free reconnaissance endpoint. Disable or gate it in production, and do not rely on the introspection cache as a security control.Value\Boolean serializing false to an empty tag — a one-line bug that silently corrupts boolean false across the wire. That class of defect is exactly what our contract tests must cover for every type: false, 0, empty string, empty array vs empty struct, nulls, UTF-8 and non-ASCII, timezone-bearing dates, large base64 blobs.Key questions
Stack fit
XmlRpcClientFactory in a service provider, wrap the package client behind our own interface (XmlRpcGateway::call(string $method, array $params): Value), and inject a transport built on Illuminate\Support\Facades\Http (or Guzzle if the v3 contract expects a PSR-18 client). Configure endpoint, timeout, connect-timeout, retry policy, and TLS verification from config/xmlrpc.php. Never let \Laminas\XmlRpc\Client appear outside the adapter namespace.POST route → one invokable controller. Controller reads the raw body, hands it to the server object, and returns the XML response with Content-Type: text/xml. Register methods via a config array mapping XML-RPC method names to [Class::class, 'method'] or closures resolved from the container — this keeps business logic in normal Laravel services and keeps the package at the edge.auth (HTTP Basic or signed shared secret), throttle, request-size limiting, structured request/response logging with correlation IDs, and a catch-all that converts every uncaught exception into a spec-compliant XML-RPC fault rather than a Laravel HTML error page. A 500 HTML body in response to an XML-RPC call is a silent, confusing client-side failure.Migration path
XmlRpcGateway and its DTOs, write the caller against that interface, and land a fake implementation. This costs little and preserves the option to replace the transport, the protocol, or the whole package without touching call sites.false, 0, empty string, empty array, and non-ASCII text.If the migration is off XML-RPC rather than onto it, invert the sequence: build the interface first, keep the XML-RPC adapter as the initial implementation, then swap in a REST/JSON adapter later. Same boundary, opposite direction of travel.
Compatibility
3.1.x) in composer.json. Do not float on ^3.0 — a patch could change fault behaviour or type marshalling, and this package has a demonstrated history of subtle serialization bugs.laminas-http is a breaking change with no first-party Laravel guidance.LIBXML_* flags explicitly through configuration and assert them in tests. Do not inherit PHP defaults implicitly.Sequencing
Maintenance
\Laminas\XmlRpc\* types across the codebase.Support
Scaling
system.* call, though introspection should be disabled in production anyway.Failure modes
false vs empty tag, 0 vs empty, date/timezone drift, integer-vs-string coercion, charset mangling of non-ASCII. Every one of these has either been a real bug in this package's history or is a classic XML-RPC failure. Contract tests are the mitigation.Ramp-up
null type in the spec, dates are ISO-8601 strings not timestamps, structs and arrays are distinct types with distinct encodings, and HTTP status codes are largely ignored in favour of in-band faults.curl one-liner that a junior will construct correctly. Build and commit a CLI command (php artisan xmlrpc:call {method} {--params=}) on day one — it is the single highest-leverage onboarding investment and doubles as a production debugging tool.How can I help you explore Laravel packages today?