PHPackages                             bundle-bus/eventhub-craft - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. bundle-bus/eventhub-craft

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

bundle-bus/eventhub-craft
=========================

CQRS / DDD bus package built on Symfony Messenger

00PHPCI passing

Since Jul 14Pushed 1mo ago1 watchersCompare

[ Source](https://github.com/diegosilva91/event-bus-php)[ Packagist](https://packagist.org/packages/bundle-bus/eventhub-craft)[ RSS](/packages/bundle-bus-eventhub-craft/feed)WikiDiscussions master Synced 2w ago

READMEChangelogDependenciesVersions (1)Used By (0)

Event Hub Craft
===============

[](#event-hub-craft)

Small CQRS / DDD bus package built on top of Symfony Messenger.

Use it when you want a thin abstraction for:

- `CommandBus`
- `QueryBus`
- `EventBus`
- `DomainEventPublisher`

The package is designed to be consumed from other PHP projects, especially Symfony-based ones.

Requirements
------------

[](#requirements)

- PHP `>= 8.1`
- Symfony Messenger `5.3.*`

Install
-------

[](#install)

```
composer require bundle-bus/eventhub-craft
```

If you are working inside this repository, you can also install dependencies with Docker:

```
docker run --rm --interactive --tty --volume $PWD:/app composer:2 composer install
```

What this package gives you
---------------------------

[](#what-this-package-gives-you)

The package ships with three domain bus contracts and Symfony Messenger adapters:

- `EventBus` -&gt; `SymfonyEventBus`
- `CommandBus` -&gt; `SymfonyCommandBus`
- `QueryBus` -&gt; `SymfonyQueryBus`

It also includes a small `DomainEventPublisher` implementation for collecting domain events inside your aggregate or application service.

Important behavior:

- Commands are dispatched and are expected to have a handler.
- Queries are dispatched and are expected to return a result.
- Events are published and may have zero, one, or many listeners.

How to integrate it in your Symfony project
-------------------------------------------

[](#how-to-integrate-it-in-your-symfony-project)

### 1. Register the services

[](#1-register-the-services)

Expose the buses as services in your Symfony application. A simple approach is to wire them directly to Messenger buses.

```
# config/services.yaml
services:
  EventHubCraft\Event\Infrastructure\Messenger\Command\SymfonyCommandBus:
    arguments:
      $commandBus: '@messenger.bus.commands'

  EventHubCraft\Event\Infrastructure\Messenger\Query\SymfonyQueryBus:
    arguments:
      $queryBus: '@messenger.bus.queries'

  EventHubCraft\Event\Infrastructure\Messenger\Event\SymfonyEventBus:
    arguments:
      $bus: '@messenger.bus.events'

  EventHubCraft\Event\Infrastructure\Messenger\Event\SymfonyDomainEventPublisher: ~
```

If you prefer aliases, map the contracts to the adapters:

```
services:
  EventHubCraft\Event\Domain\Bus\Command\CommandBus:
    alias: EventHubCraft\Event\Infrastructure\Messenger\Command\SymfonyCommandBus

  EventHubCraft\Event\Domain\Bus\Query\QueryBus:
    alias: EventHubCraft\Event\Infrastructure\Messenger\Query\SymfonyQueryBus

  EventHubCraft\Event\Domain\Bus\Event\EventBus:
    alias: EventHubCraft\Event\Infrastructure\Messenger\Event\SymfonyEventBus
```

### 2. Configure Messenger buses

[](#2-configure-messenger-buses)

Use separate buses so each intent stays explicit.

```
# config/packages/messenger.yaml
framework:
  messenger:
    buses:
      messenger.bus.commands:
        default_middleware: allow_no_handlers
        middleware:
          - validation

      messenger.bus.queries:
        default_middleware: allow_no_handlers

      messenger.bus.events:
        default_middleware: allow_no_handlers
```

This keeps your application aligned with CQRS:

- commands mutate state
- queries read state
- events notify the rest of the system

### 3. Define your message classes

[](#3-define-your-message-classes)

Extend the package base classes in your application layer.

```
