#[Aggregate], #[AggregateIdentifier], aggregate command handlers, repository abstraction, #[Saga] as process managers, bounded-context isolation via Distributed Bus, Domain Events as first-class plain PHP classes.
Composer package · Laravel or Symfony · PostgreSQL or MySQL · RabbitMQ, Kafka, SQS, Redis, or DBAL outbox
Command, query, and event bus — all auto-wired from your attributes. No registration, no factory classes, no container bindings.
Store events, not state. Aggregates, projections, replay, snapshotting. Partitioned + streaming projections so rebuilds parallelize across workers and catch up in real time — no single-process bottleneck.
Stateful long-running processes with compensation. Handler-chaining workflows for stateless pipelines. Saga timeouts in one #[Delayed] attribute. All declarative, all attribute-driven.
Aggregate publishes event. Saga subscribes by attribute. Projection subscribes by attribute. Async handler subscribes by attribute. The attribute is the wiring.
Same aggregates, handlers, sagas, and projections run on Laravel, Symfony, or any PSR-11 container. Hedge against framework changes over a decade.
Each row names what you'd need to add to match Ecotone, and the architectural ceiling that integration cannot fix.
An event-sourcing library, not a DDD framework. Laravel-only.
Cleanest DDD ergonomics — but a library, not an architecture.
Strong attribute-based aggregates — but an ES package, not a DDD architecture.
DDD vocabulary as PHP attributes — no base classes, no DSL between domain and framework.
Haven’t found what you’re looking for? Contact us
Unleash the power of Messaging in PHP
and push productivity to the higher level
