symfony/event-dispatcher-contracts
A small set of PHP interfaces that abstract Symfony's event dispatcher, letting you build on proven event semantics and swap implementations without locking your code to a specific package.
EventDispatcherInterface, Event, StoppableEventInterface), not runtime behavior. Adopting it is therefore a low-cost architectural commitment, not a feature investment: it costs one composer require and a code-style convention, and it buys optionality if we ever dispatch or consume events outside Laravel.Illuminate\Contracts\Events\Dispatcher keeps that package installable in Symfony, Lumen, or plain-PHP contexts. This is a one-way-door decision worth getting right early and cheap to get right now.Leading indicator to watch: does anything in our portfolio actually run outside Laravel today? If no, this decision has no near-term payoff and should be parked, not scheduled.
Adopt when:
Look elsewhere — or do nothing — when:
Illuminate\Events is idiomatic, better documented, better tooled (Event::fake(), make:event), and already covers it.spatie/laravel-psr-event-dispatcher or a homegrown adapter) and has no bandwidth to own it. Dependents: 0 in this data is the warning light: there is essentially no Laravel-specific ecosystem around this package, so we would be the maintainer of last resort for any bridge we adopt.Gating questions before approval: Why PSR-14 — real cross-framework need or speculative elegance? Which dispatcher do we keep? How many existing listeners would need signature changes? Does anything depend on Event::fake()?
For executives — frame as insurance, not a feature. "This is a small, free, standards-based interface package backed by Symfony's API stability guarantee. It doesn't add functionality; it removes a future switching cost. Concretely: our domain events stop being Laravel-shaped, so if we add a Symfony service, acquire a team on a different stack, or ship a module to a customer with a mixed environment, that work doesn't require rewriting event logic. It's MIT-licensed, interfaces-only, and reversible in a single commit — the cost is a coding convention plus a short review, not a migration. I'm recommending we apply it to our shared library only, and explicitly not touch the dispatcher."
For engineering — frame as a two-phase decision with a clear stop line.
Symfony\Contracts\EventDispatcher\Event. Laravel's own Event already extends the Symfony base, so this is compatible with the native dispatcher and changes nothing at runtime. Add a lint/CI rule so the convention holds.Ask: a one-sprint pilot scoped to a single shared module, with a written decision to defer dispatcher migration until a concrete cross-framework consumer exists.
How can I help you explore Laravel packages today?