Symfony Bundle ยท PHP 8.2+ ยท Packagist

Stop writing the same HTTP client over and over

An integration engine for Symfony that centralizes your external APIs under clear contracts.

Copied! composer require carlosgude/integration-engine

Every integration ends up as an isolated case

Different formats, inconsistent auth, duplicated cache logic. Code fragments and every new API means starting from scratch.

Duplicated auth

Tokens and cache reimplemented in every integration.

No common contract

Every HTTP client has its own structure.

Hard to test

HTTP coupled to domain. Impossible to isolate.

No consistency

Every developer solves it their own way.

Zero visibility

No traceability, no unified logs, no shared context.

One flow for all your integrations

A single entry point. Each step has a clear responsibility.

Registryโ†’
IntegrationEngineโ†’
Actionโ†’
Authโ†’
HTTPโ†’
Mapperโ†’
Response DTO

Dynamic auth with cache

OAuth, sessions, API keys. The engine resolves and caches them automatically.

Path context

/orders/{id} resolved at call time. Explicit failure if param is missing.

Three-layer headers

YAML โ†’ auth โ†’ call layer. Each layer overrides the previous. No magic.

Typed responses

Each action defines its own Response DTO with a guaranteed contract.

Fully extensible

Client, cache and config source replaceable with one line in YAML.

Scaffolding included

make:integration generates Mapper, Response DTO and YAML in seconds.

One line. Always the same.

No magic strings โ€” everything through contracts.

// No authentication
$registry->get(
    AcmeIntegration::NAME
)->send(
    GetUsersAction::getName()
);
// With route params โ€” /users/{id}
$registry->get(
    AcmeIntegration::NAME
)->send(
    GetUserAction::getName(),
    context: DefaultActionContext::create(['id' => 42])
);
// With body and custom headers
$registry->get(
    AcmeIntegration::NAME
)->send(
    CreateOrderAction::getName(),
    body:    $body,
    headers: new CorrelationHeaders($id)
);

The bundle suggests. Doesn't enforce.

Three levels that emerge naturally. Use what you need.

ClassResponsibilityScope
CreateChargeActionOnly declares the method, path and response DTO. No HTTP logic.Concrete action
StripeActionAuth, base path and common Stripe headers. Reused by all its actions.Integration
AbstractActionBase contract provided by the engine. Extensible without touching the core.Bundle

The make:integration command creates the config, classes and YAML in one step.

Have a question?

Write to us and we'll get back to you as soon as possible.

Start with one command

No boilerplate. No arbitrary decisions. Just your business logic.