Extension Points

The package stays intentionally small, but it still offers several clean places for extension.

1. Bring Your Own Listener Provider

Because EventDispatcher only depends on ListenerProviderInterface , you can plug in any PSR-14 provider.

This is the main extension point if your application already has custom lookup rules.

2. Build Wildcard Observers

WildcardListenerProvider is a convenient base class when one provider should receive every dispatched object.

Typical uses:

  • event logging;
  • metrics;
  • audit trails;
  • tracing.

3. Attach Additional Providers Through Configuration

With the service provider integration, classes implementing ListenerProviderInterface can be listed under the configuration key Psr\EventDispatcher\ListenerProviderInterface::class .

Those providers are attached to the aggregate provider after the built-in strategies.

4. Add Error Observers

ErrorEvent makes failure observation extensible. You can attach listeners for:

  • logging;
  • metrics;
  • tracing;
  • notifications;
  • cleanup tasks.

5. Build Rich Stoppable Events

StoppableEventTrait is a small building block for events that need stoppable behavior but already extend another base class.

6. Mix Listener Styles Gradually

A useful extension strategy is evolutionary rather than technical:

  • keep old Symfony subscribers;
  • add new invokable listeners;
  • introduce attributed listeners where they improve readability;
  • attach a custom provider when one bounded context needs special lookup behavior.

What This Package Does Not Expose

The current codebase does not expose:

  • singleton accessors;
  • facade-style static helpers;
  • alias maps beyond container service aliases for the dispatcher interfaces.

That is a design choice. Composition happens through constructors and the container, not through global state.