domainreseller/php-dna
PHP client for the Domain Reseller API supporting both REST and SOAP. Automatically detects whether you're using Reseller ID/API Key or legacy username/password credentials. Manage domains, contacts, and orders from any PHP 7.4+ app. Installs via Composer.
Updated for the V4.0.0 major release (SOAP → REST gateway migration, unified Reseller ID + API Key auth).
Architecture fit
domainreseller/php-dna remains a thin vendor client for the DomainNameApi reseller API — not a Laravel package in the framework sense. V4.0.0 does not change that: no ServiceProvider, no facade, no publishable config is described. What does change is that the transport is now a single modern REST/JSON gateway with the legacy SOAP path retired end-to-end. That is an architectural improvement for us: JSON over HTTPS aligns naturally with Guzzle/PSR-18/PSR-7, which is what Laravel already ships and what our HTTP middleware (retry, logging, tracing) can wrap. The correct architecture is unchanged: an internal RegistrarContract with a single DomainNameApiAdapter implementation, a FakeRegistrar for tests, and an architecture test enforcing that only App\Registrar\* touches the vendor namespace.
One caveat worth resolving early: the release notes reference panel settings screens, language files, and per-language installation guides. That reads like a WHMCS module or a plugin-with-admin-UI artifact, not a headless PHP client. Confirm that the Composer package we depend on is the same codebase the changelog describes, or that the UI layer ships separately and does not drag admin routes/views into a Laravel app.
Integration feasibility Still low plumbing friction, and materially lower than before. The two prior environment prerequisites are gone:
ext-soap. One fewer "works locally, fails in staging" class of incident.The semantic friction is unchanged and remains the bulk of the work: asynchronous registration/transfer lifecycles (pending → active/failed), TLD-specific mandatory fields (.tr documents, EU registrant eligibility), and money moving on every write. Estimate holds at 1–2 weeks to production-grade. Note that "your saved settings keep working" applies only to consumers already on Reseller ID + API Key — our own adapter config keys will change, so treat this as a breaking change on our side regardless.
Technical risk
RegistrarContract stable — the contract is precisely what makes this release survivable.register after a timeout is still a double-charge and a duplicate-domain attempt. REST gateways commonly add Idempotency-Key support; if the gateway offers it and the client does not expose it, we must implement it at the HTTP layer (and if the gateway does not offer it, timeout-then-domain.info remains our only safe path).429 / Retry-After on the REST gateway. Our HTTP middleware needs explicit 429 handling with jittered backoff, distinct from generic 5xx retry.Key questions
429/Retry-After or swallow it?Stack fit
Laravel 10–12 on PHP 8.1+, with one prerequisite removed (ext-soap no longer needed — good news for slim base images and CI parity). Containment strategy is unchanged and now more clearly justified:
config/registrar.php with reseller_id and api_key from env/secret manager (never committed). New key names — migrate secrets, do not alias the old username/password vars.App\Registrar\DomainNameApiAdapter implements RegistrarContract.RegistrarServiceProvider binding the adapter as a singleton, with configured HTTP client options (timeouts, 429-aware retry, connection reuse).App\Registrar\FakeRegistrar for tests, backed by freshly recorded REST fixtures — v3 SOAP fixtures are worthless.App\Registrar\* may reference the vendor namespace.All writes go through queued jobs with a per-registrar concurrency cap (start at 5). Persist domains and domain_orders as a mirror, not the system of record — DNA owns state; we own reconciliation and reporting.
Migration path Two migrations are now in play, and they must be sequenced: v3→v4 of the client, then incumbent→DNA (if applicable). Do not run both at once.
RegistrarContract — if the contract holds, this is a contained change.Compatibility
Pin an exact version (4.0.x or a commit hash) and commit composer.lock. Fork into our org on day one — the transport rewrite is exactly the scenario the fork protects against. If v4's Guzzle/PSR-18 constraints conflict with the app, isolation is now easier than before: a small internal provisioning service or a dedicated queue worker with its own dependency tree, with no SOAP extension to install in that image.
Sequencing
429/Retry-After awareness, jittered; append-only order event log.Maintenance Budget a named owner and ~3–5 hours/month for the first two quarters (up from ~2–4), reflecting the fresh-rewrite risk: dependency review, nightly OTE smoke test in CI, and a contract test that catches REST API drift before customers do. The library is still small and readable; the burden remains our adapter and the domain-industry edge cases. The v4 rewrite is the single largest maintenance event in this dependency's history — treat the first 90 days as a watch period.
Support Unchanged and still the weakest dimension: no commercial support, no SLA, no documented security contact. Escalation is GitHub issues to one author plus DomainNameApi reseller support. The runbook now needs new entries:
domain.info, never blind-retry.Scaling Registrar APIs are low-QPS; load scales with domain count, not traffic. 10k domains is ~10k renewals/year — trivial throughput. The differences in V4 are transport-level and favourable: HTTP connection reuse and HTTP/2 are available where SOAP was a heavyweight per-call cost, so batch operations get cheaper. New scaling concerns:
429 ceilings; batch jobs must be token-bucket shaped, not fire-and-forget.Failure modes
domain.info before any retry. Never blind-retry writes. Unchanged, still the top risk.Ramp-up A mid-level PHP developer is productive with the client in half a day; REST/JSON is more familiar to most Laravel developers than SOAP was, so this is slightly faster than before. Budget 1–2 weeks to production readiness including adapter, queue semantics, reconciliation, and the OTE test suite — plus ~2–3 extra days specifically for the v3→v4 delta and the privacy review. The genuine learning curve remains domain-industry mechanics: EPP status codes, transfer locks, redemption fees, TLD-specific eligibility.
TPM verdict
Update the dependency, do not re-litigate the decision. V4.0.0 is a net-positive change — retiring SOAP removes a real deployment constraint and a whole class of support tickets, the unified credential model simplifies secret handling, and a JSON/REST transport fits Laravel's HTTP stack better than SOAP ever did. But it is a major release from a single-maintainer project, so it must be treated as a controlled migration, not a composer update: fork, pin, re-record fixtures against OTE, review telemetry before it touches production, and keep the v3 fork buildable as the rollback. The prior verdict holds — viable as a tactical adapter inside a DomainNameApi reseller relationship, not a platform to standardize on. Above roughly 5k domains or any revenue-critical dependency, plan to own the fork permanently, or write a few hundred lines of internal client directly against the now-simpler REST API and skip the dependency entirely. That last option got meaningfully cheaper with this release.
How can I help you explore Laravel packages today?