innmind/event-bus
A lightweight event bus for PHP from the Innmind ecosystem. Publish domain events and register listeners or handlers to react to them, keeping producers and consumers decoupled behind a small, predictable API that fits neatly into larger Innmind applications.
Illuminate\Contracts\Events\Dispatcher, which already ships with the framework, is queue-aware, and has first-class testing helpers (Event::fake()). The real product decision the evaluation surfaces is "do we need a third-party dispatcher at all?" — and the answer for a Laravel codebase is almost always no.Adoption criteria (all would need to hold simultaneously):
When to look elsewhere (the default position):
Illuminate\Contracts\Events\Dispatcher already covers in-process dispatch, queueing via ShouldQueue, broadcasting, wildcard listeners, and test faking. Adding a second dispatcher creates two event systems, two mental models, and a class of bugs where events fire on one bus and listeners are registered on the other.Verdict for the ADR: reject for adoption; retain as a design reference. The opportunity score (~19/100) and the archive flag are consistent with that reading — this is a library whose value has been absorbed by better-maintained, framework-native alternatives.
For executives — the one-paragraph version:
We evaluated innmind/event-bus as a possible component for decoupling parts of the product through events. Recommendation: do not adopt. It is a free, MIT-licensed library, but it is archived, has no downstream users, and duplicates functionality Laravel already provides out of the box. Adopting it would add a maintenance liability — someone internally would effectively own a dead open-source project — with no offsetting capability. The cost of not adopting is zero; the cost of adopting is a permanent, low-grade maintenance tax plus a second eventing model for engineers to learn. No budget or headcount is requested. We recommend standardizing on the framework's native event dispatcher and documenting this evaluation so it is not revisited.
For engineering leads — the technical summary:
The library gives you an explicit, container-free dispatcher with hand-registered listeners. That is a legitimate design preference, but it is not one we can act on here: it belongs to the Innmind functional-PHP ecosystem, it is archived, and it has no dependents. In a Laravel codebase it would sit alongside Illuminate\Contracts\Events\Dispatcher, not replace it, giving us two dispatch paths and a predictable crop of "why didn't my listener fire" incidents. If what you actually want is explicit listener wiring, we can get 90% of it with a service provider that registers every listener by hand and a lint rule banning string-based auto-discovery — same architectural benefit, zero new dependencies. If what you want is async, retries, and dead-lettering, that is a different conversation: Symfony Messenger or Laravel Queues + Horizon, both of which we should scope properly rather than solve with a micro-library.
What we are asking for: sign-off on the no-adopt recommendation, and agreement that the underlying need — "our modules are too coupled" or "we need reliable async event handling" — gets its own ticket with a proper options analysis. The package is not the problem worth solving; the coupling is.
How can I help you explore Laravel packages today?