Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,16 @@ class NotificationService

Every flow — sync, async, sagas, projections — runs through the same messaging pipeline in production and in tests. Swap the in-memory channel for RabbitMQ, Kafka, SQS, Redis, or DBAL in production; the test shape never changes.

Visit [ecotone.tech](https://ecotone.tech) to learn more.
## Topic deep dives

- [Durable Workflows in PHP](https://ecotone.tech/durable-workflows) — long-running processes, sagas, orchestrators, event-sourced replay on your existing DB + broker
- [Event Sourcing in PHP](https://ecotone.tech/event-sourcing) — built-in event store, projections (catch-up, partitioned, streaming), blue-green rebuilds, PII encryption end-to-end
- [Asynchronous Communication](https://ecotone.tech/asynchronous-communication) — message channels, retries, outbox, delayed messages, scheduling, dead letter with replay
- [Domain-Driven Design in PHP](https://ecotone.tech/domain-driven-design) — aggregates, repositories, domain events, sagas — all via attributes
- [Orchestration Layer](https://ecotone.tech/orchestration-layer) — declarative multi-step workflows, EIP routing, dynamic step lists
- [Microservices](https://ecotone.tech/microservices) — Distributed Bus, Service Map, multi-broker single topology

Visit [ecotone.tech](https://ecotone.tech) for the full overview.

> Works with [Symfony](https://docs.ecotone.tech/modules/symfony-ddd-cqrs-event-sourcing), [Laravel](https://docs.ecotone.tech/modules/laravel-ddd-cqrs-event-sourcing), or any PSR-11 framework via [Ecotone Lite](https://docs.ecotone.tech/install-php-service-bus#install-ecotone-lite-no-framework).

Expand Down
14 changes: 11 additions & 3 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,19 @@
"keywords": [
"ddd",
"cqrs",
"EventSourcing",
"event-sourcing",
"sagas",
"durable-workflows",
"durable-execution",
"workflow",
"outbox",
"projections",
"ecotone",
"service-bus"
"service-bus",
"message-driven",
"event-driven"
],
"description": "Enterprise architecture layer for Laravel and Symfony — CQRS, Event Sourcing, Sagas, Projections, Workflows, and Outbox messaging via PHP attributes.",
"description": "Enterprise architecture layer for Laravel and Symfony — CQRS, Event Sourcing, Durable Workflows (Sagas, Orchestrators), Projections, and Outbox messaging via PHP attributes.",
"repositories": [
{
"type": "path",
Expand Down
2 changes: 1 addition & 1 deletion packages/Amqp/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ From `#[CommandHandler]` on day one, to event sourcing, sagas, outbox, and distr

## AMQP / RabbitMQ transport

Route `#[Asynchronous]` handlers to RabbitMQ. Exchanges, queues, and bindings are declared from your PHP configuration, and every message flows through Ecotone's standard retry, outbox, and dead letter pipeline — so switching to AMQP in production never changes how your handlers or tests are written.
Route `#[Asynchronous]` handlers to RabbitMQ. Exchanges, queues, and bindings are declared from your PHP configuration, and every message flows through Ecotone's standard [retry, outbox, and dead letter pipeline](https://docs.ecotone.tech/solutions/unreliable-async-processing) — so switching to AMQP in production never changes how your handlers or tests are written. Carries [asynchronous communication](https://ecotone.tech/asynchronous-communication), [durable workflow](https://ecotone.tech/durable-workflows) execution, and [cross-service distribution](https://ecotone.tech/microservices) on the same broker.

Supports both implementations:

Expand Down
11 changes: 6 additions & 5 deletions packages/Amqp/composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,13 @@
"rabbitmq",
"rabbit",
"messaging",
"asynchronous",
"message",
"enterprise integration patterns",
"async-messaging",
"message-broker",
"eip",
"distributed architecture",
"domain driven design"
"ecotone",
"outbox",
"durable-workflows",
"saga"
],
"description": "AMQP / RabbitMQ transport for Ecotone asynchronous messaging, outbox, and dead letter.",
"repositories": [
Expand Down
2 changes: 1 addition & 1 deletion packages/DataProtection/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ From `#[CommandHandler]` on day one, to event sourcing, sagas, outbox, and distr

## Data Protection

Attribute-driven encryption and PII masking for Ecotone messages. Mark sensitive fields on commands, events, or queries and Ecotone handles protection transparently — in message channels, event stores, dead letter queues, and traces — without changing your handler code.
Attribute-driven encryption and PII masking for Ecotone messages. Mark sensitive fields on commands, events, or queries and Ecotone handles protection transparently — in [message channels](https://ecotone.tech/asynchronous-communication), [event stores](https://ecotone.tech/event-sourcing), dead letter queues, and traces — without changing your handler code. See the [Data Protection module docs](https://docs.ecotone.tech/modules/data-protection) for setup and key management.

- **Field-level encryption** — sensitive fields encrypted in transit and at rest
- **PII masking** — configurable masking for logs and traces
Expand Down
12 changes: 8 additions & 4 deletions packages/DataProtection/composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,14 @@
],
"keywords": [
"ecotone",
"Encryption",
"OpenSSL",
"Sensitive Data Protection",
"Secure Messages"
"encryption",
"pii",
"gdpr",
"data-protection",
"crypto-shredding",
"openssl",
"sensitive-data",
"secure-messages"
],
"description": "Field-level encryption and PII masking for Ecotone messages \u2014 GDPR-friendly data protection with crypto-shredding.",
"repositories": [
Expand Down
7 changes: 4 additions & 3 deletions packages/Dbal/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,12 @@ From `#[CommandHandler]` on day one, to event sourcing, sagas, outbox, and distr

## Doctrine DBAL integration

Database-backed foundation for Ecotone, built on Doctrine DBAL. Use your existing relational database as a message transport, outbox, or dead letter store — no extra infrastructure required to get started.
Database-backed foundation for Ecotone, built on Doctrine DBAL. Use your existing relational database as a [message transport](https://ecotone.tech/asynchronous-communication), outbox, dead letter store, or [durable saga state](https://ecotone.tech/durable-workflows) — no extra infrastructure required to get started.

- **DBAL message channel** — durable asynchronous channel backed by your database
- **Outbox pattern** — atomic commit of business state and outbound messages, so no event is lost on crash
- **DBAL message channel** — durable [asynchronous channel](https://ecotone.tech/asynchronous-communication) backed by your database
- **Outbox pattern** — atomic commit of business state and outbound messages, so no event is lost on crash ([details](https://docs.ecotone.tech/solutions/unreliable-async-processing))
- **Dead Letter Queue** — failed messages persisted to your database, inspectable and replayable
- **Saga state storage** — non-event-sourced sagas persist their state per `#[Identifier]` in your DB
- **Document Store** — aggregates persisted as JSON documents, no ORM required
- **Business Interfaces** — declarative DBAL query methods via `#[DbalBusinessMethod]`
- **Transactional message handling** — each handler wrapped in a DB transaction automatically
Expand Down
11 changes: 9 additions & 2 deletions packages/Dbal/composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,16 @@
],
"keywords": [
"dbal",
"ecotone"
"doctrine",
"ecotone",
"outbox",
"dead-letter-queue",
"messaging",
"saga",
"durable-workflows",
"document-store"
],
"description": "Doctrine DBAL integration for Ecotone \u2014 database-backed message channel, outbox pattern, dead letter queue, and document store.",
"description": "Doctrine DBAL integration for Ecotone \u2014 database-backed message channel, outbox pattern, dead letter queue, durable saga state storage, and document store.",
"repositories": [
{
"type": "path",
Expand Down
27 changes: 15 additions & 12 deletions packages/Ecotone/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -102,17 +102,20 @@ Swap the in-memory channel for DBAL, RabbitMQ, or Kafka in production — the te

## What's in the box

| Area | What you get |
|---|---|
| **Messaging** | Command / Query / Event buses, routing, interceptors, business interfaces (gateways) |
| **Domain modelling** | Aggregates, Sagas, state-stored or event-sourced — all via attributes |
| **Event Sourcing** | Event Store, Projections (catch-up, partitioned, streaming), event versioning and upcasting, DCB |
| **Workflows** | Stateless workflows, orchestrators (routing slip), saga-based process managers |
| **Async & resiliency** | `#[Asynchronous]`, retries, error channels, dead letter queue with replay, Outbox pattern |
| **Observability** | OpenTelemetry tracing, Service Map (Enterprise) |
| **Multi-tenancy** | Per-tenant connections, event stores, and async channels |
| **Distribution** | Distributed Bus for cross-service events and commands |
| **Data protection** | Field-level encryption and PII masking for messages |
| Area | What you get | Deep dive |
|---|---|---|
| **Messaging** | Command / Query / Event buses, routing, interceptors, business interfaces (gateways) | [docs](https://docs.ecotone.tech/modelling/command-handling) |
| **Domain modelling** | Aggregates, Sagas, state-stored or event-sourced — all via attributes | [ecotone.tech/domain-driven-design](https://ecotone.tech/domain-driven-design) |
| **Event Sourcing** | Event Store, Projections (catch-up, partitioned, streaming), event versioning and upcasting, snapshots | [ecotone.tech/event-sourcing](https://ecotone.tech/event-sourcing) |
| **Durable Workflows** | Stateless workflows, sagas, orchestrators (routing slip), event-sourced sagas with full replay — long-running processes that survive crashes, deploys, and restarts on the DB + broker you already run | [ecotone.tech/durable-workflows](https://ecotone.tech/durable-workflows) |
| **Asynchronous communication** | `#[Asynchronous]`, message channels, delayed messages, scheduling, priority, TTL, dynamic channels | [ecotone.tech/asynchronous-communication](https://ecotone.tech/asynchronous-communication) |
| **Resiliency** | Retries, error channels, dead letter queue with replay, Outbox pattern, deduplication | [docs](https://docs.ecotone.tech/solutions/unreliable-async-processing) |
| **Orchestration** | EIP routing, splitters, filters, transformers, multi-step orchestrators (Enterprise) | [ecotone.tech/orchestration-layer](https://ecotone.tech/orchestration-layer) |
| **Observability** | OpenTelemetry tracing, Service Map (Enterprise) | [docs](https://docs.ecotone.tech/modules/opentelemetry-tracing-and-metrics) |
| **Multi-tenancy** | Per-tenant connections, event stores, and async channels | [docs](https://docs.ecotone.tech/messaging/multi-tenancy-support) |
| **Distribution** | Distributed Bus for cross-service events and commands | [ecotone.tech/microservices](https://ecotone.tech/microservices) |
| **Data protection** | Field-level encryption and PII masking for messages | [docs](https://docs.ecotone.tech/modules/data-protection) |
| **Testing** | `EcotoneLite::bootstrapFlowTesting` — full flows in-process, no broker required | [docs](https://docs.ecotone.tech/modelling/testing-support) |

---

Expand Down Expand Up @@ -181,4 +184,4 @@ If you want to help building and improving Ecotone consider becoming a sponsor:

## Tags

PHP, DDD, CQRS, Event Sourcing, Sagas, Projections, Workflows, Outbox, Symfony, Laravel, Service Bus, Event Driven Architecture
PHP, DDD, CQRS, Event Sourcing, Sagas, Projections, Durable Workflows, Durable Execution, Workflows, Orchestrator, Outbox, Symfony, Laravel, Service Bus, Event Driven Architecture
11 changes: 8 additions & 3 deletions packages/Ecotone/composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,19 @@
"keywords": [
"ddd",
"cqrs",
"EventSourcing",
"event-sourcing",
"sagas",
"durable-workflows",
"durable-execution",
"workflow",
"outbox",
"projections",
"ecotone",
"service-bus",
"message-driven",
"event",
"event-driven"
],
"description": "Enterprise architecture layer for Laravel and Symfony \u2014 CQRS, Event Sourcing, Sagas, Projections, Workflows, and Outbox messaging via PHP attributes.",
"description": "Enterprise architecture layer for Laravel and Symfony \u2014 CQRS, Event Sourcing, Durable Workflows (Sagas, Orchestrators), Projections, and Outbox messaging via PHP attributes.",
"repositories": [
{
"type": "path",
Expand Down
2 changes: 1 addition & 1 deletion packages/Enqueue/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ From `#[CommandHandler]` on day one, to event sourcing, sagas, outbox, and distr

Shared adapter layer between Ecotone and [Enqueue](https://github.com/php-enqueue/enqueue) — the PHP messaging abstraction used by Ecotone's AMQP, Redis, and SQS transports. You typically don't install this package directly; it's pulled in by whichever transport package you use.

Install it directly only when building a custom Enqueue-backed transport (e.g., Stomp, Gearman, Beanstalkd) and integrating it with Ecotone's channel and consumer lifecycle.
Install it directly only when building a custom Enqueue-backed transport (e.g., Stomp, Gearman, Beanstalkd) and integrating it with Ecotone's channel and consumer lifecycle — useful for [asynchronous communication](https://ecotone.tech/asynchronous-communication) on a broker Ecotone doesn't ship a dedicated package for.

Visit [ecotone.tech](https://ecotone.tech) to learn more.

Expand Down
7 changes: 6 additions & 1 deletion packages/Enqueue/composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,12 @@
],
"keywords": [
"enqueue",
"ecotone"
"ecotone",
"message-broker",
"async-messaging",
"amqp",
"sqs",
"redis"
],
"description": "Enqueue adapter layer for Ecotone \u2014 shared base for AMQP, Redis, and SQS transports.",
"repositories": [
Expand Down
2 changes: 1 addition & 1 deletion packages/JmsConverter/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ From `#[CommandHandler]` on day one, to event sourcing, sagas, outbox, and distr

## JMS Serializer media type converter

Integration between Ecotone's media type converter system and [JMS Serializer](https://github.com/schmittjoh/serializer). Use JMS annotations to control serialization of commands, events, and query responses — custom naming, groups, type handlers — when Ecotone's default converter isn't enough.
Integration between Ecotone's [media type converter system](https://docs.ecotone.tech/messaging/conversion/conversion) and [JMS Serializer](https://github.com/schmittjoh/serializer). Use JMS annotations to control serialization of commands, events, and query responses — custom naming, groups, type handlers — when Ecotone's default converter isn't enough.

Typical reasons to reach for this:

Expand Down
2 changes: 2 additions & 0 deletions packages/JmsConverter/composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
"messaging",
"ecotone",
"serializer",
"jms",
"jms-serializer",
"integration",
"json",
"xml",
Expand Down
2 changes: 1 addition & 1 deletion packages/Kafka/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ From `#[CommandHandler]` on day one, to event sourcing, sagas, outbox, and distr

## Apache Kafka transport

Route `#[Asynchronous]` handlers to Kafka topics with partition-aware consumers and the same retry, outbox, and dead letter semantics as every other Ecotone transport. Publish from one service and consume in another via the Distributed Bus — switching transports never changes how your handlers or tests are written.
Route `#[Asynchronous]` handlers to Kafka topics with partition-aware consumers and the same [retry, outbox, and dead letter semantics](https://docs.ecotone.tech/solutions/unreliable-async-processing) as every other Ecotone transport. Publish from one service and consume in another via the [Distributed Bus](https://ecotone.tech/microservices) — switching transports never changes how your handlers or tests are written. Carries [asynchronous communication](https://ecotone.tech/asynchronous-communication) and [durable workflow](https://ecotone.tech/durable-workflows) execution on the same broker.

- **Partitioned consumers** — ordering guarantees per key
- **Consumer groups** — scale out horizontally
Expand Down
8 changes: 7 additions & 1 deletion packages/Kafka/composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,13 @@
],
"keywords": [
"ecotone",
"Kafka"
"kafka",
"apache-kafka",
"streaming",
"message-broker",
"async-messaging",
"distributed-bus",
"event-streaming"
],
"description": "Apache Kafka transport for Ecotone asynchronous messaging and Distributed Bus.",
"repositories": [
Expand Down
4 changes: 2 additions & 2 deletions packages/Laravel/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ From `#[CommandHandler]` on day one, to event sourcing, sagas, outbox, and distr

## Ecotone for Laravel

Laravel handles HTTP beautifully. But the moment you need Event Sourcing, Sagas, or multi-step workflows, you're stitching packages together. Ecotone gives you one coherent toolkit — Aggregates, Projections, Outbox, and more — all attribute-driven, all testable in-process, all running on the Laravel queues you already have.
Laravel handles HTTP beautifully. But the moment you need [Event Sourcing](https://ecotone.tech/event-sourcing), [Sagas, or multi-step workflows](https://ecotone.tech/durable-workflows), you're stitching packages together. Ecotone gives you one coherent toolkit — Aggregates, Projections, [Outbox](https://docs.ecotone.tech/solutions/unreliable-async-processing), and more — all attribute-driven, all testable in-process, all running on the Laravel queues you already have.

- **Works with Eloquent and Doctrine**
- **Laravel Queue integration** — use your existing queue drivers
Expand Down Expand Up @@ -64,4 +64,4 @@ If you want to help building and improving Ecotone consider becoming a sponsor:

## Tags

PHP, Laravel, Eloquent, DDD, CQRS, Event Sourcing, Sagas, Projections, Workflows, Outbox, Service Bus, Laravel Queue
PHP, Laravel, Eloquent, DDD, CQRS, Event Sourcing, Sagas, Projections, Durable Workflows, Workflows, Outbox, Service Bus, Laravel Queue
15 changes: 10 additions & 5 deletions packages/Laravel/composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,18 @@
"keywords": [
"ddd",
"cqrs",
"messaging",
"eip",
"distributed architecture",
"laravel",
"laravel-queue",
"event-sourcing",
"sagas",
"durable-workflows",
"workflow",
"outbox",
"ecotone",
"ddd and cqrs on top of eip"
"messaging",
"eip"
],
"description": "Ecotone for Laravel \u2014 CQRS, Event Sourcing, Sagas, and Workflows on top of Laravel Queue, via PHP attributes.",
"description": "Ecotone for Laravel \u2014 CQRS, Event Sourcing, Sagas, Durable Workflows, and Outbox on top of Laravel Queue, via PHP attributes.",
"repositories": [
{
"type": "path",
Expand Down
4 changes: 2 additions & 2 deletions packages/LiteApplication/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ From `#[CommandHandler]` on day one, to event sourcing, sagas, outbox, and distr

## Ecotone Lite — framework-agnostic

Not on Laravel or Symfony? Ecotone Lite integrates with your existing PSR-11 container to provide Command, Event, and Query buses — plus the full feature set of Aggregates, Sagas, Projections, and Event Sourcing. Same attributes, same testing, same architecture.
Not on Laravel or Symfony? Ecotone Lite integrates with your existing PSR-11 container to provide Command, Event, and Query buses — plus the full feature set of [Aggregates](https://ecotone.tech/domain-driven-design), [Sagas and durable workflows](https://ecotone.tech/durable-workflows), Projections, and [Event Sourcing](https://ecotone.tech/event-sourcing). Same attributes, same testing, same architecture.

- **Any PSR-11 container**
- **Full feature set available** — nothing framework-specific is held back
Expand Down Expand Up @@ -60,4 +60,4 @@ If you want to help building and improving Ecotone consider becoming a sponsor:

## Tags

PHP, PSR-11, Ecotone Lite, DDD, CQRS, Event Sourcing, Sagas, Projections, Workflows, Outbox, Service Bus
PHP, PSR-11, Ecotone Lite, DDD, CQRS, Event Sourcing, Sagas, Projections, Durable Workflows, Workflows, Outbox, Service Bus
Loading
Loading