tourcms/tourcms-php
A PHP client for the TourCMS API that simplifies connecting your app to tours, bookings, customers, and related resources. It handles API authentication and requests, making it easier to build tour-booking and management features in Laravel or plain PHP.
Architecture fit. tourcms/tourcms-php is a thin, framework-agnostic client for the TourCMS REST API (tours, availability, bookings, channels, customers) — not a Laravel package. It belongs in the outbound-integration layer of the app, behind a gateway/repository interface, so domain code never touches SDK response objects. That isolation is not optional here: v4.10.0's headline change ("handle strings instead of XML objects," TOURCMS-10566) is precisely the kind of serialization detail that leaks into controllers and jobs if the client is called ad hoc. Architecturally this is a "wrap it, don't scatter it" decision.
Integration feasibility. High on effort-to-value. Composer-installable, dependency-light (HTTP client + XML parsing), and the vendor already publishes the API surface we'd otherwise hand-roll. The two additive endpoints — customer create and verify — are the commercially interesting part: they enable self-serve signup → verification → booking without an ops person provisioning records in TourCMS admin. That converts a manual workflow into a product funnel, which is the strongest argument for adoption. Note there is no first-party laravel-tourcms provider, config publish, or facade; we own roughly 100 lines of glue.
Technical risk.
instanceof SimpleXMLElement, property access, or foreach over an assumed XML node graph may break silently or throw Call to a member function ... on string. Treat a minor bump as potentially breaking; this is the highest-probability incident source in the upgrade.Key questions.
create/verify enabled on our marketplace credentials — and what are their rate limits and idempotency semantics (safe to retry on timeout)?ext-simplexml still hard-required now that strings are tolerated? Could this simplify our base image?Stack fit. Workable but non-idiomatic Laravel. The correct shape is a TourCmsServiceProvider binding a configured singleton, credentials in config/services.php + .env, and a TourCmsGateway interface with an SDK-backed implementation. Controllers, jobs, and console commands depend on the interface only. That single decision contains the blast radius of every future minor release and gives us one place to log request/response pairs.
Migration path. Two independent tracks, do not conflate them:
Compatibility. Verify explicitly: PHP constraint, Guzzle major (Laravel 10/11 pin 7), whether ext-simplexml remains required, and whether our adapter code assumes object-ness anywhere. If the SDK now tolerates string payloads, we may be able to loosen a dependency — small, but real.
Sequencing.
Maintenance. Low code surface — it's a client library, not a service. The recurring cost is upgrade triage, and 4.10.0 proves that even a minor bump can change types. Budget a quarterly upstream review instead of auto-merging Dependabot PRs; pin exact versions in composer.lock and require a green integration suite before any bump. Assign a named owner for the upstream relationship.
Support. Burden concentrates in two places: (a) TourCMS API behavior drift, which the SDK does not shield us from, and (b) business-side questions about the new customer endpoints ("why is this customer unverified?"). Route everything through the gateway so logging is consistent. Set expectations: support is GitHub issues from a small vendor team, not an SLA channel — escalate API-level problems through the TourCMS account manager.
Scaling. Client-side scaling is a non-issue; the SDK is stateless and cheap. Real constraints are upstream rate limits and latency, plus XML parsing cost on large payloads (tour lists, availability grids). Add timeouts and retries at the adapter boundary, cache read-heavy reference data (tours, locations) with short TTLs, and never call booking-critical writes synchronously inside a web request — queue them. Watch memory if the string change implies full-body buffering.
Failure modes.
Ramp-up. Roughly half a day for a Laravel-fluent PHP developer to install, bind, and issue a first successful call. One to two days to do it properly behind a gateway with contract tests. The customer verification/create work adds about a day of sandbox integration plus product/legal review if customer PII crosses the boundary. No specialist TourCMS knowledge is needed to start, but someone must own the upgrade cadence and vendor relationship — that is the real ongoing commitment, and it is the thing most likely to be left unowned.
How can I help you explore Laravel packages today?