lafourchette/adobe-campaign-client-bundle
Symfony bundle that integrates the Adobe Campaign client into your application, providing configuration and services for connecting to and interacting with Adobe Campaign APIs.
Architecture fit — primary finding: this is not a Laravel package.
The name is literal: adobe-campaign-client-bundle is a Symfony bundle, published by Lafourchette (Accor group). Bundles integrate through Symfony's DependencyInjection component — an Extension class for semantic config, services.yaml/XML definitions, autowiring, and event dispatcher hooks. Laravel's container is a different implementation with different autowiring semantics and no bundle registration concept. Consequences:
composer require will succeed, but nothing auto-registers. There is no ServiceProvider, no publishable config, no facade.symfony/dependency-injection and symfony/config into the dependency graph even though Laravel doesn't use them for bootstrapping — dead weight unless manually driven.xtk schema), not the bundle wiring.Integration feasibility: medium-low, but not blocking.
The extraction path is well understood: fork the repo, keep the client/transport classes, discard the DependencyInjection/ and Resources/config/ directories, and write a thin Laravel ServiceProvider plus a config/adobe-campaign.php. That yields a package you own. The alternative — a Symfony-bundle-to-Laravel bridge package — is a hard no for a production marketing integration; it adds an unmaintained shim between two frameworks for no benefit.
Technical risk — mostly supply chain, not code.
xtk:session logon, token passed on every subsequent call). It works, but it is legacy; Adobe's roadmap steers toward Campaign v8 / ACC cloud with different surfaces. The ext-soap requirement is a hard hosting constraint and generates noisy deprecations on modern PHP.xtk schema is painful; confident integration tests require a non-production Campaign instance, which is often gated behind Adobe partner/support entitlement.Key questions before any commitment
ext-soap available and permitted in our runtime (containers, platform limits, security policy)?Stack fit. Laravel 10/11 already ships several Symfony components (console, http-foundation, process), but not the DI Extension/bundle machinery this package relies on. Treat the package as a source library to vendor, not a dependency to install-and-go.
Recommended path — fork-and-adapter, in sequence:
composer.json metadata for our PHP constraint and run static analysis (PHPStan) to surface PHP 8.x breakage immediately.DependencyInjection/, Resources/config/, and any Symfony event subscriber wiring. Keep the client, DTOs, and exception types.ServiceProvider. Register the client as a singleton with config injected from config/adobe-campaign.php, reading credentials from env/secret manager. Publish the config with sane defaults (endpoint, login, password, session TTL, timeout).AdobeCampaignClient in our domain layer with only the methods we actually use. The package becomes one implementation. This is the single highest-value decision — it caps the blast radius of abandonment and gives a clean swap path to a REST-based client later.Compatibility checks to run in week one: composer.json PHP and symfony/* version constraints, ext-soap presence, Guzzle/HTTP client version alignment with Laravel's existing dependencies, and any mcrypt or other removed-extension references in older SOAP tooling.
Sequencing to first production call. Proof of concept against non-production (~1 sprint) → interface + provider + config (~3 days) → queue integration and error taxonomy (~1 sprint) → load test with realistic audience sizes → cutover behind a feature flag. Do not parallelize the POC with the abstraction work; the POC tells you whether the client is even viable against your instance version.
Maintenance — you own it outright. With no upstream maintenance and no dependents, there is no upgrade path and no one to escalate to. Budget explicitly: one engineer maintaining the fork, dependency updates reviewed quarterly, and a documented upgrade procedure for major PHP versions. The mitigating factor is that SOAP against a stable vendor API has a shallow dependency tree — ext-soap does most of the work — so the ongoing surface is smaller than a typical Guzzle-based package.
Support. No README-level operational guidance, no issue activity, no security contact. Adobe Campaign errors surface as opaque SOAP faults; without Adobe support entitlement or partner documentation access, debugging stalls at the API boundary. Confirm entitlement before the POC, not after — it is a genuine gating item, not a formality.
Scaling. The binding constraints are on the Campaign side, not the Laravel side:
queryDef results serialize fully into memory. Stream or paginate at the domain layer.Failure modes to design for explicitly:
| Failure | Detection | Mitigation |
|---|---|---|
| Session expiry mid-batch | SOAP auth fault | Re-logon + resume at checkpoint |
| Throttling / 429-equivalent | Fault codes | Exponential backoff, per-instance rate limiter |
| Partial success in bulk send | Per-record response codes | Idempotency keys, reconciliation job |
| Schema drift after Campaign upgrade | Fixture contract tests in CI | Pin and retest on every AC upgrade |
| Credential rotation | Auth faults | Secret manager + zero-downtime reload |
| Silent send failures | Absent delivery logs | Reconcile against Campaign delivery status API |
The last row is the one that burns marketing teams: a batch that returns success but doesn't deliver. Build a reconciliation job before go-live, not after the first incident.
Ramp-up. Expect 1–2 weeks for a competent Laravel engineer to become productive, dominated by Adobe Campaign's xtk schema rather than by the package itself. Add onboarding docs to the fork — the original repo has none, and the knowledge will otherwise live in one person's head.
Recommendation. Feasible, but only as a vendor-and-own exercise behind a first-party interface. The abandonment signals (0 stars, 0 dependents, zero support surface) are the dominant risk, not the code quality. If our Campaign scope is send-side only and small, a direct POC of the extracted client is worth one sprint. If the integration is strategic or long-lived, budget for replacing the SOAP client within 18–24 months as Adobe's roadmap moves away from this API surface.
How can I help you explore Laravel packages today?