3.2 KiB
3.2 KiB
Beacon Specification (SPECS)
Overview
Beacon is a high-performance, PSR-14 compliant event management system. It is designed to be decoupled, utilizing BeaconContracts for interfaces and providing an enterprise-grade engine with middleware support, attribute-based discovery, and telemetry.
1. Core Interfaces (BeaconContracts)
The foundation of Beacon must be defined in getphred/beacon-contracts.
- EventDispatcherInterface: Extends
Psr\EventDispatcher\EventDispatcherInterface. - ListenerProviderInterface: Extends
Psr\EventDispatcher\ListenerProviderInterface. - SubscriberInterface: Defines
getSubscribedEvents(): array. - StoppableEventInterface: Extends
Psr\EventDispatcher\StoppableEventInterface. - DispatchMiddlewareInterface: Defines
handle(object $event, callable $next): object.
2. Event Dispatcher (The Engine)
The primary implementation of the dispatcher.
- PSR-14 Compliance: Must correctly handle event objects and return them.
- Middleware Support: Implements an "Onion" style pipeline.
- Global middleware can intercept every dispatch.
- Middleware can modify the event or stop propagation.
- Resiliency Modes:
FAIL_FAST: Stops execution on the first listener exception.CONTINUE: Logs the error, dispatches aDispatchFailedinternal event, and moves to the next listener.
- Telemetry: Internal tracking of listener execution time and memory usage.
3. Listener Provider & Resolution
The logic for finding who cares about an event.
- Priority Handling: Listeners are sorted by priority (higher integer runs first).
- Inheritance Resolution:
- Automatically resolves listeners for the event class, its parents, and its interfaces.
- Must include a performance toggle to disable interface scanning.
- Wildcard Support:
- Support dot-notation wildcards (e.g.,
user.*,*.created). - Pattern matching converted to optimized regex with internal caching.
- Support dot-notation wildcards (e.g.,
- Lazy Loading: Integration with a PSR-11 container to instantiate listeners only when they are about to be called.
4. Discovery & Registration
Mechanisms to register listeners without manual configuration.
- Attribute Discovery:
- Support
#[AsEventListener(event: string, priority: int)]. - Support
#[AsSubscriber].
- Support
- Listener Discovery Service:
- Scans directories for classes with Beacon attributes.
- Integrates with PSR-16 cache to avoid scanning on every request.
- Manual Registration:
addListener(string $event, callable $listener, int $priority = 0)addSubscriber(SubscriberInterface $subscriber)
5. Event Objects & Context
Enhancing the standard event pattern.
- Event Envelope:
- A wrapper to carry immutable metadata (e.g.,
request_id,user_id,timestamp). - Uses a
ContextMapfor type-safe metadata access.
- A wrapper to carry immutable metadata (e.g.,
- Stoppable Trait: Provide
CanStopPropagationtrait for easy implementation ofStoppableEventInterface.
6. Testing Utilities
- EventCollector: A listener that gathers all dispatched events for assertions.
- PHPUnit Assertions: Traits for
assertEventDispatched,assertEventNotDispatched, andassertListenerCalled.