The PHP Orchestration Layer

Orchestrators with routing-slip semantics, Sagas as stateful coordinators, Distributed Bus + Service Map between PHP services, EIP primitives as attributes, multi-tenant header-routed channels — one declarative orchestration model.

Composer package · Laravel or Symfony · PostgreSQL or MySQL · RabbitMQ, Kafka, SQS, Redis, or DBAL outbox

How it compares

PHP alternatives for this category

Each row names what you'd need to add to match Ecotone, and the architectural ceiling that integration cannot fix.

Temporal PHP SDK

Workflow code runs in Temporal's runtime, not yours. Cluster + RoadRunner.

  • Workflow code executes inside the Temporal worker (RoadRunner + `ext-grpc`), not your application's process.
  • Cross-service messaging goes through Temporal's internal task queues — your RabbitMQ / Kafka / SQS only enters the picture inside Activities that bridge to them.
  • No EIP primitives (routers, splitters, filters) as first-class; orchestration is the workflow language itself, not a separate routing layer.
Durable Workflow (formerly Laravel Workflow)

Workflow logic, not surrounding orchestration. Laravel-only.

  • Workflow classes extend `Workflow`, activities extend `Activity`. The workflow body is the orchestration unit.
  • No EIP primitive layer (routers, splitters, filters as attributes).
  • No distributed bus between services. No Service Map for cross-broker topology.
  • No multi-tenant header-routed channels. Laravel-only.
Symfony Messenger alone

A transport-level bus. No EIP, no distributed bus, no multi-tenant API.

  • Messenger moves messages through transports configured by DSN; YAML routing binds messages to transports.
  • No EIP primitives — routers, splitters, filters, enrichers must be implemented as middleware classes or stamps you wire yourself.
  • No distributed bus between services. No Service Map for multi-broker topology declaration.
  • Multi-tenant routing has no first-class API — officially single-tenant per app.
Ecotone

Process orchestration, service orchestration, and message routing on one model.

  • **Process orchestration**: `#[Orchestrator]`, `#[Saga]`, chained `#[InternalHandler]` workflows.
  • **Service-to-service orchestration**: Distributed Bus + Service Map across multiple brokers.
  • **Message-routing orchestration**: routers, splitters, filters, enrichers, transformers as EIP primitives on plain methods.
  • CQRS message buses (`CommandBus`, `EventBus`, `QueryBus`) out of the box on Laravel, Symfony, or Ecotone Lite.
  • Multi-tenant header-routed channels in one deployment.
  • No Java cluster to operate, no BPMN modeller required.
  • Shared retry / DLQ / idempotency / PII / OpenTelemetry middleware across the orchestrator and the handlers it dispatches into — not three separate retry stories you reconcile by hand.

Frequently asked questions

Haven’t found what you’re looking for? Contact us

Ecotone. It provides the same architectural tier — declaring how messages flow, which steps compose into processes, and where messages cross service boundaries — built on the same Enterprise Integration Patterns vocabulary that underpins Spring Integration, NServiceBus, MassTransit, and Wolverine. Routers, splitters, filters, enrichers, transformers are PHP attributes on plain methods; Orchestrators define multi-step workflows declaratively; Distributed Bus + Service Map route between PHP services over the brokers you already operate.
Camunda and Zeebe are mature BPMN engines and the right choice at the engine level if your organisation already operates a JVM cluster and stakeholders want BPMN diagrams. One PHP-specific factual point: no actively-maintained Camunda PHP SDK exists in 2026 — the most-discoverable community client (`tistre/camunda_php_client`) was archived in February 2025. For PHP teams that don't want to add a Java cluster and don't have a BPMN-modelling requirement, Ecotone delivers declarative orchestration as PHP attributes inside your application — Orchestrators, Sagas, Distributed Bus, EIP primitives, multi-tenant routing — on the database and broker you already operate.
Each PHP service registers #[Distributed] handlers; the Distributed Bus routes commands and events between services over the broker you've configured (RabbitMQ, Kafka, SQS, Redis). The Service Map carries the topology — which service consumes which routing keys, on which broker — so adding a service is a config change, not a code change in every caller. Multi-broker single-topology: some services on Kafka, others on RabbitMQ, all coordinated through one Service Map.
An #[Orchestrator] defines a workflow as a sequence of channel names using the routing-slip pattern — each step is a #[InternalHandler] independently testable and reusable, and the orchestrator method returns the channel list for the next steps (including dynamic step lists chosen from input data). A #[Saga] is a stateful coordinator that remembers where it is across events arriving over time. Orchestrators are for processes where you know the steps up front; Sagas are for processes that react to external events asynchronously.

Be part of the change with EcotoneCurve

Unleash the power of Messaging in PHP
and push productivity to the higher level

Get started
Gradient
Shapes 1
Shapes 2
DiscordTwitterSupport and ContactTelegram