Skip to main content

EventRegistry

The EventRegistry is responsible for managing domain events and their metadata definitions. It keeps a mapping between stable event keys and their corresponding event classes, as well as full DomainEventDefinition instances for use in UI, automation, and logging.

When to Use EventRegistry

Use EventRegistry when you need:

  • Event registration: Register domain events for key-based lookup
  • Key resolution: Resolve event keys to their corresponding classes
  • Metadata lookup: Get rich metadata (title, description, icon, tags) for events
  • Event listing: Get all registered events for UI/automation
  • Key lookup: Find the stable key for an event class or instance
  • Event validation: Check if an event is registered

Example scenarios:

  • Registering domain events in service providers
  • Building event selection UIs
  • Event logging and audit systems
  • Workflow automation builders
  • Rule engine configuration
  • API documentation generation

Overview

EventRegistry maintains two internal mappings:

  • Class Map: Maps stable keys to event class names
  • Definition Map: Maps stable keys to DomainEventDefinition instances

Namespace

JobMetric\EventSystem\Support\EventRegistry

Quick Start

Inject the registry or resolve it from the container:

use JobMetric\EventSystem\Support\EventRegistry;
use App\Events\UserRegistered;

$registry = app(EventRegistry::class);

// Register an event
$registry->register(UserRegistered::class);

// Check if event exists
if ($registry->has('user.registered')) {
// Event is registered
}

// Get event class by key
$eventClass = $registry->forKey('user.registered');

// Get metadata definition
$definition = $registry->definitionForKey('user.registered');

// Get all definitions
$allDefinitions = $registry->allDefinitions();

Available Methods

register(string $eventClass): void

Register a domain event with a given key and event class.

Parameters:

  • $eventClass (class-string<DomainEvent>): The concrete domain event class to register

Returns: void

Throws: InvalidArgumentException if the class doesn't implement DomainEvent

Behavior:

  • The key is resolved from the DomainEvent implementation via its static key() method
  • Both the class mapping and the DomainEventDefinition are stored
  • If the event is already registered, it will be overwritten

Example:

use JobMetric\EventSystem\Support\EventRegistry;
use App\Events\UserRegistered;
use App\Events\ProductCreated;

$registry = app(EventRegistry::class);

// Register events
$registry->register(UserRegistered::class);
$registry->register(ProductCreated::class);

forKey(string $key): ?string

Get the event class for the given key.

Parameters:

  • $key (string): The stable event key to look up

Returns: `class-string<DomainEvent>`|null

Example:

$registry = app(EventRegistry::class);

// Get event class
$eventClass = $registry->forKey('user.registered');
// Returns: 'App\Events\UserRegistered' or null if not found

if ($eventClass) {
// Event is registered
}

definitionForKey(string $key): ?DomainEventDefinition

Get the metadata definition for a given key.

Parameters:

  • $key (string): The stable event key to look up

Returns: DomainEventDefinition|null

Example:

$registry = app(EventRegistry::class);

$definition = $registry->definitionForKey('user.registered');

if ($definition) {
echo $definition->title; // Translation key
echo $definition->description; // Translation key
echo $definition->icon; // Icon class
echo implode(', ', $definition->tags); // Tags array
}

allDefinitions(): array

Get all registered metadata definitions keyed by their event keys.

Returns: array<string, DomainEventDefinition>

Example:

$registry = app(EventRegistry::class);

$definitions = $registry->allDefinitions();

foreach ($definitions as $key => $definition) {
echo "Event: {$key}\n";
echo "Title: " . trans($definition->title) . "\n";
echo "Group: " . trans($definition->group) . "\n";
echo "Tags: " . implode(', ', $definition->tags ?? []) . "\n\n";
}

has(string $key): bool

Determine whether an event with the given key is registered.

Parameters:

  • $key (string): The stable event key to check existence for

Returns: bool

Example:

$registry = app(EventRegistry::class);

if ($registry->has('user.registered')) {
// Event is registered
}

keyFor(object|string $event): ?string

Get the stable key for the given event instance or event class.

Parameters:

  • $event (object|string): The event instance or event class name to resolve a key for

Returns: string|null

Example:

$registry = app(EventRegistry::class);

// From instance
$event = new UserRegistered(123, 'user@example.com', 'John');
$key = $registry->keyFor($event);
// Returns: 'user.registered'

// From class name
$key = $registry->keyFor(UserRegistered::class);
// Returns: 'user.registered'

Complete Example

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use JobMetric\EventSystem\Support\EventRegistry;
use App\Events\UserRegistered;
use App\Events\UserUpdated;
use App\Events\ProductCreated;
use App\Events\ProductUpdated;
use App\Events\OrderCompleted;

class EventSystemServiceProvider extends ServiceProvider
{
public function boot(EventRegistry $registry): void
{
// Register user events
$registry->register(UserRegistered::class);
$registry->register(UserUpdated::class);

// Register product events
$registry->register(ProductCreated::class);
$registry->register(ProductUpdated::class);

// Register order events
$registry->register(OrderCompleted::class);
}
}

Use Cases

Event Selection UI

class EventSelectorComponent
{
public function getAvailableEvents(): array
{
$registry = app(EventRegistry::class);
$definitions = $registry->allDefinitions();

return collect($definitions)
->map(function ($definition, $key) {
return [
'key' => $key,
'title' => trans($definition->title),
'description' => trans($definition->description),
'icon' => $definition->icon,
'tags' => $definition->tags ?? [],
'group' => trans($definition->group),
];
})
->groupBy('group')
->toArray();
}
}

Event Logging

class EventLogger
{
public function logEvent(object $event): void
{
$registry = app(EventRegistry::class);
$key = $registry->keyFor($event);

if ($key) {
$definition = $registry->definitionForKey($key);

Log::info('Domain event fired', [
'key' => $key,
'title' => trans($definition->title),
'description' => trans($definition->description),
'tags' => $definition->tags,
]);
}
}
}

API Documentation

class EventDocumentationController extends Controller
{
public function index()
{
$registry = app(EventRegistry::class);
$definitions = $registry->allDefinitions();

$events = collect($definitions)->map(function ($definition, $key) {
return [
'key' => $key,
'class' => $registry->forKey($key),
'title' => trans($definition->title),
'description' => trans($definition->description),
'icon' => $definition->icon,
'tags' => $definition->tags ?? [],
'group' => trans($definition->group),
];
})->values();

return response()->json($events);
}
}

Best Practices

  1. Register in Service Providers: Register all domain events in service providers during boot
  2. Check Before Use: Always check if an event exists before using it
  3. Use Keys Consistently: Use the same key format across your application
  4. Provide Rich Metadata: Include complete metadata for UI/automation
  5. Group Related Events: Use consistent group names for related events