PHPackages                             solidframe/event-driven - 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. solidframe/event-driven

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

solidframe/event-driven
=======================

Event-driven building blocks: EventBus implementation, listener resolver for SolidFrame

v0.1.0(1mo ago)06MITPHPPHP ^8.2

Since Apr 11Pushed 1mo agoCompare

[ Source](https://github.com/solidframe/event-driven)[ Packagist](https://packagist.org/packages/solidframe/event-driven)[ RSS](/packages/solidframe-event-driven/feed)WikiDiscussions main Synced 1w ago

READMEChangelog (1)Dependencies (1)Versions (2)Used By (0)

SolidFrame Event-Driven
=======================

[](#solidframe-event-driven)

EventBus implementation with listener resolution and middleware support.

Dispatch domain events to one or more listeners. Decouple your application with event-driven communication.

Installation
------------

[](#installation)

```
composer require solidframe/event-driven
```

Quick Start
-----------

[](#quick-start)

### Define an Event

[](#define-an-event)

```
use SolidFrame\Core\Event\DomainEventInterface;

final readonly class OrderPlaced implements DomainEventInterface
{
    public function __construct(
        public string $orderId,
        public string $customerId,
        private DateTimeImmutable $occurredAt = new DateTimeImmutable(),
    ) {}

    public function eventName(): string
    {
        return 'order.placed';
    }

    public function occurredAt(): DateTimeImmutable
    {
        return $this->occurredAt;
    }
}
```

### Define Listeners

[](#define-listeners)

```
use SolidFrame\EventDriven\EventListener;

final readonly class SendOrderConfirmation implements EventListener
{
    public function __construct(private Mailer $mailer) {}

    public function __invoke(OrderPlaced $event): void
    {
        $this->mailer->send($event->customerId, 'Your order has been placed.');
    }
}

final readonly class UpdateInventory implements EventListener
{
    public function __construct(private InventoryService $inventory) {}

    public function __invoke(OrderPlaced $event): void
    {
        $this->inventory->reserve($event->orderId);
    }
}
```

### Dispatch

[](#dispatch)

```
$eventBus->dispatch(new OrderPlaced(
    orderId: 'order-123',
    customerId: 'customer-456',
));
// Both SendOrderConfirmation and UpdateInventory will be called
```

Standalone Usage
----------------

[](#standalone-usage)

Without a framework bridge:

```
use SolidFrame\EventDriven\Listener\InMemoryListenerResolver;
use SolidFrame\EventDriven\Bus\EventBus;

$resolver = new InMemoryListenerResolver();
$resolver->listen(OrderPlaced::class, new SendOrderConfirmation($mailer));
$resolver->listen(OrderPlaced::class, new UpdateInventory($inventory));

$eventBus = new EventBus($resolver);
$eventBus->dispatch(new OrderPlaced('order-123', 'customer-456'));
```

Middleware
----------

[](#middleware)

Add cross-cutting concerns to event processing.

```
use SolidFrame\Core\Middleware\MiddlewareInterface;

final readonly class EventLoggingMiddleware implements MiddlewareInterface
{
    public function __construct(private LoggerInterface $logger) {}

    public function handle(object $message, callable $next): mixed
    {
        $this->logger->info('Event dispatched', [
            'event' => $message::class,
        ]);

        return $next($message);
    }
}

$eventBus = new EventBus($resolver, [
    new EventLoggingMiddleware($logger),
]);
```

Key Differences from CQRS
-------------------------

[](#key-differences-from-cqrs)

Command/QueryEventHandlersExactly oneZero or moreReturn valueQuery returns dataNonePurposeExecute action / fetch dataNotify what happenedAPI Reference
-------------

[](#api-reference)

Class / InterfacePurpose`EventListener`Marker interface for listeners`ListenerResolverInterface`Contract for resolving listeners per event`InMemoryListenerResolver`In-memory listener registry`EventBus`Dispatches events to all resolved listenersRelated Packages
----------------

[](#related-packages)

- [solidframe/core](../core) — `DomainEventInterface`, `EventBusInterface`, Middleware
- [solidframe/ddd](../ddd) — AggregateRoot records events via `recordThat()`
- [solidframe/cqrs](../cqrs) — Dispatch events after command handling
- [solidframe/event-sourcing](../event-sourcing) — Persist events as source of truth
- [solidframe/laravel](../laravel) — Auto-discovery, DI, `make:domain-event`, `make:event-listener`
- [solidframe/symfony](../symfony) — Compiler pass, DI, same generators

Contributing
------------

[](#contributing)

This repository is a read-only split of the [solidframe/solidframe](https://github.com/solidframe/solidframe) monorepo, auto-synced on every push to `main`. Issues, pull requests, and discussions belong in the monorepo.

###  Health Score

35

—

LowBetter than 77% of packages

Maintenance89

Actively maintained with recent releases

Popularity4

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity36

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

59d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/97de2a466719393a21a8ce5caef247a1afb8aec5a8974248da0583f4197765b2?d=identicon)[abdulkadir-posul](/maintainers/abdulkadir-posul)

---

Top Contributors

[![abdulkadir-posul](https://avatars.githubusercontent.com/u/88670954?v=4)](https://github.com/abdulkadir-posul "abdulkadir-posul (1 commits)")

### Embed Badge

![Health badge](/badges/solidframe-event-driven/health.svg)

```
[![Health](https://phpackages.com/badges/solidframe-event-driven/health.svg)](https://phpackages.com/packages/solidframe-event-driven)
```

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
