solophp / async-event-dispatcher
Async event dispatcher with pluggable adapters
v1.0.0
2025-09-30 15:43 UTC
Requires
- php: ^8.2
- psr/event-dispatcher: ^1.0
- solophp/contracts: dev-main@dev
Requires (Dev)
- phpstan/phpstan: ^2.1
- psr/container: ^2.0
- squizlabs/php_codesniffer: ^3.13
Suggests
- psr/container: ^2.0
- solophp/job-queue: ^1.0
README
Async event dispatcher with pluggable adapters.
Features
- PSR-14 Compatible: Implements
Psr\EventDispatcher\EventDispatcherInterface
- Async dispatch via
$dispatcher->dispatch()
- Pluggable adapters:
InMemoryAdapter
,SoloJobQueueAdapter
(with built-inAsyncEventJob
) - Worker to consume and execute events
- Reference-based listener registry with priorities
- Customizable serialization via
SerializerInterface
- Framework-agnostic, minimal setup
Requirements
- PHP ^8.1
- Optional:
solophp/job-queue
^1.0 (forSoloJobQueueAdapter
)
PSR-14 Compatibility
This library implements the PSR-14 Event Dispatcher standard, making it compatible with any framework or library that expects an EventDispatcherInterface
.
use Psr\EventDispatcher\EventDispatcherInterface; use Solo\AsyncEventDispatcher\AsyncEventDispatcher; // AsyncEventDispatcher implements EventDispatcherInterface function processEvent(EventDispatcherInterface $dispatcher, object $event): object { return $dispatcher->dispatch($event); } $asyncDispatcher = new AsyncEventDispatcher($registry, $adapter); $modifiedEvent = processEvent($asyncDispatcher, new UserRegistered('john'));
Install
composer require solophp/async-event-dispatcher
# Optional for DB-backed queue:
composer require solophp/job-queue
Usage (in-memory)
use Solo\AsyncEventDispatcher\{ReferenceListenerRegistry, ListenerReference, AsyncEventDispatcher, Worker}; use Solo\AsyncEventDispatcher\Adapter\InMemoryAdapter; final class UserRegistered { public function __construct(public string $username) {} } final class SendWelcomeEmail { public function __invoke(UserRegistered $e): void { echo "sent:" . $e->username . "\n"; } } $registry = new ReferenceListenerRegistry(); $registry->addReference(UserRegistered::class, new ListenerReference(SendWelcomeEmail::class)); $adapter = new InMemoryAdapter(); $publisher = new AsyncEventDispatcher($registry, $adapter); $worker = new Worker($adapter); $event = $publisher->dispatch(new UserRegistered('john')); $worker->run();
Usage (Solo Job Queue Adapter)
The SoloJobQueueAdapter
provides database-backed async event processing with built-in AsyncEventJob
for seamless integration.
use Solo\AsyncEventDispatcher\Adapter\SoloJobQueueAdapter; use Solo\AsyncEventDispatcher\{AsyncEventDispatcher, Worker}; use Solo\JobQueue\JobQueue; use Doctrine\DBAL\DriverManager; $connection = DriverManager::getConnection([ 'driver' => 'pdo_sqlite', 'path' => __DIR__ . '/var/queue.sqlite', ]); $queue = new JobQueue($connection); $queue->install(); // SoloJobQueueAdapter automatically uses AsyncEventJob internally $adapter = new SoloJobQueueAdapter($queue, $container); $publisher = new AsyncEventDispatcher($registry, $adapter); $worker = new Worker($adapter); $event = $publisher->dispatch(new UserRegistered('john')); $worker->run();
The adapter automatically handles:
- Event serialization via
AsyncEventJob
- Job queuing with
'async_event'
type - Listener resolution through container
- Event deserialization and execution
Testing
# Run tests composer test # Run code sniffer composer cs # Fix code style issues composer cs-fix
License
This project is open-sourced under the MIT license.