Sagas, orchestrators, chained workflows, outbox, and #[Delayed] saga timeouts — on the database and broker you already operate. No separate workflow service. Plain PHP classes with attributes.
Composer package · Laravel, Symfony, or Tempest · PostgreSQL or MySQL · RabbitMQ, Kafka, SQS, Redis, or DBAL outbox
Crash-resistant multi-step processes on your existing database and broker. Sagas, orchestrators, chained workflows, outbox, and #[Delayed] timeouts — plain PHP attributes, no separate workflow service, no replay-deterministic DSL.
Stateful long-running processes with compensation. Handler-chaining workflows for stateless pipelines. Saga timeouts in one #[Delayed] attribute. All declarative, all attribute-driven.
Transactional outbox, DBAL dead-letter queue with replay, retries with exponential backoff, deduplication, OpenTelemetry on every handler — default behaviour, not assembly required.
A copy of the message is dispatched to every handler. Each retries independently, fails independently — no shared envelope, no sibling re-runs. One failing subscriber doesn't abort the others.
Aggregate publishes event. Saga subscribes by attribute. Projection subscribes by attribute. Async handler subscribes by attribute. The attribute is the wiring.
Each tool below is a capable choice for its slice. Ecotone covers the same ground and adds the operational layer around it — so aggregates, projections, sagas, and messaging share one model and one set of guarantees.
Best-in-class durable execution, on its own runtime.
Where Ecotone goes further than this library
ext-grpc.Date::now, randomness, and direct I/O are all fine.A focused Laravel-native durable-workflow engine.
Where Ecotone goes further than this library
#[Delayed] timeouts — on Laravel or Symfony.#[Saga] adds an identifier-mapped process manager that lives across events arriving over time.A mature message bus and transport layer.
Where Ecotone goes further than this library
#[Saga] process manager and stateless chained workflows on top of the bus.#[Delayed] gives event handlers timeout/wait semantics (TimeSpan, DateTime, or expression) via the broker's delayed-message primitive — no custom scheduler.A robust job runner with strong operational tooling.
Where Ecotone goes further than this library
#[Saga] coordinator that persists state across events over time, on the same Laravel queues.CombinedMessageChannel): each step's message is committed to the database with its business write, then handled by consuming from the broker.#[Delayed] timeouts, orchestrators, and chained handlers provide the workflow shapes on top of the queue.Durable execution on your own database — three workflow shapes, one model.
#[Saga] for stateful processes that react to events over time. #[Orchestrator] for declarative routing-slip workflows whose step list is visible at one glance. Chained #[InternalHandler] for stateless flows where the message carries the state.#[Delayed] resumes a handler after a TimeSpan, an exact DateTime, or an expression — the broker's delayed-message primitive does the waiting. No cron, no separate timer service.#[Distributed] handlers and the Distributed Bus extend the workflow across bounded contexts on the brokers you already operate — the retry / DLQ / idempotency / outbox guarantees apply uniformly inside the saga and across service boundaries.Haven’t found what you’re looking for? Contact us
Unleash the power of Messaging in PHP
and push productivity to the higher level
