th3mouk/eventstore-bundle
A Symfony bundle that integrates an event store into your application, providing configuration, services and console commands for persisting and replaying domain events. It keeps event-sourcing setup minimal so you can focus on aggregates and projections instead of infrastructure.
Architecture fit — The first thing to correct at intake: this is a Symfony bundle, not a Laravel package, despite how it was filed. Its actual value-add is small — a DI extension and service definitions that wire a Guzzle HTTP client to EventStore's legacy REST/AtomPub surface. There is no Laravel service provider, facade, or publishable config. On a Laravel roadmap item, this is not a candidate; it is a reference. As a TPM, the actionable finding is process-level: the discovery pipeline mislabeled the artifact, and that should be fixed before it costs someone a sprint.
Integration feasibility — Poor as a shipped dependency and cheap as a fork. Archived upstream means no releases, no PHP 8 work, no Guzzle 7 support, and no security response. The functional surface is genuinely small (append events, read streams, subscribe by polling), so the engineering effort to own it is low. The product question is not "can we integrate it" but "why would we acquire a dependency with no maintainer when the code we'd depend on is a few hundred lines we could own outright."
Technical risk — High, and correlated across axes: unmaintained upstream, 5 stars, 0 dependents (no community to catch regressions), and a transport bet on EventStore's HTTP/AtomPub API, which has been de-emphasized in favor of gRPC in modern EventStoreDB. Even a successful integration is a commitment to a deprecated interface. Frame this to stakeholders as transport risk, not just dependency risk — the two compound.
Key questions — These are the ones that gate funding:
Stack fit — Misaligned on both stacks. Laravel: incompatible by construction; treat as reference code only. Symfony: workable solely on legacy versions where the bundle's kernel and extension API still exist. Neither gives a supported forward path, so the integration plan is really a build plan with this repo as source material.
Migration path — Do not add it to composer.json in production. Two realistic options, and the TPM should force a choice between them on spike evidence:
EventStoreClient interface we control. Small surface, clear ownership, transport swappable later.The default recommendation is (b) for greenfield, (a) only when there is an existing HTTP EventStore deployment we must interoperate with.
Compatibility — Expect conflicts on Guzzle major version, PHP version floor, and Symfony component constraints. Resolution likely requires ignore-platform-reqs or a fork — both of which are risk-register entries, not workarounds to wave through.
Sequencing — (1) Timeboxed spike — one working day — proving publish/read of a stream against the target EventStoreDB version, with credentials, content negotiation, and concurrency check. (2) Fork-vs-build decision on that evidence. (3) If forking, wrap behind an owned interface before any domain code touches it. (4) Wire into application services. (5) Only then discuss production. Each gate is a decision point, not a formality — the spike is designed to fail cheaply if the transport bet is wrong.
Maintenance — Effectively 100% ours from day one. Upstream is archived, so every PHP, Guzzle, or Symfony upgrade becomes a fork conflict we resolve. Budget a small but permanent maintenance tax. The mitigating factor is code volume: it is small enough to absorb, which is also the argument for just owning it rather than carrying a fake dependency.
Support — None. No issue triage, no CVE response, no upstream contact. Internal ownership, written runbooks, and a named maintainer are mandatory rather than optional. If procurement or compliance requires an actively maintained, versioned dependency, this fails the gate outright and should be recorded as such.
Scaling — The HTTP/AtomPub transport is chatty: batching is limited and per-request overhead dominates high-throughput append workloads. Guzzle connection pooling helps, but the ceiling is materially below gRPC. Before committing, model expected event volume and peak append rate against that ceiling — a number, not a vibe.
Failure modes — Silent behavioral drift against newer EventStoreDB builds; no built-in retry, backoff, or idempotency on append (duplicate events are a real correctness risk in an append-only store); timeout and connection-exhaustion behavior inherited from Guzzle defaults; basic-auth credential handling that needs verification. All of this must be hardened in the adapter layer, and that hardening is part of the cost estimate — not an afterthought.
Ramp-up — Learning the package itself is an afternoon; it is thin. The dominant cost is EventStoreDB operational knowledge — stream design, projections, optimistic concurrency, subscriptions — plus event-sourcing modeling discipline on the team. That investment is independent of this package and should be resourced separately in the roadmap, because it is the actual commitment.
Recommendation — Do not adopt as a dependency. Keep it as reference material, or fork the minimal client surface behind an interface we own. Treat gRPC or a maintained event-sourcing library as the strategic path, and confirm first that the underlying requirement justifies EventStoreDB at all rather than an append-only table. Record the finding on the technology radar as avoid — unmaintained, deprecated transport, and fix the intake labeling so Symfony artifacts stop arriving under Laravel briefs.
How can I help you explore Laravel packages today?