gdbots/pbjx-bundle
Symfony bundle for integrating Gdbots PBJX with Symfony applications. It registers PBJX services, message bus and event-sourcing components, and configuration so you can wire PBJ schemas and messaging into your app with less boilerplate.
What the package actually is. gdbots/pbjx-bundle is a Symfony bundle, not a Laravel package. It is the dependency-injection glue layer that wires gdbots/pbjx messaging primitives (command bus, event bus, request bus, service locators, tagged handler discovery) into a Symfony application's container via a bundle class, an extension/config tree, and compiler passes. The messaging engine itself lives in gdbots/pbjx; the message contracts live in gdbots/pbj and are generated from .proto schemas. Adopting this bundle means adopting that whole stack.
Architecture fit. Poor for a Laravel codebase, strong for a Symfony one. Laravel has no concept of bundles, Extension classes, config/bundles.php, tagged-service collection, or compiler passes — and the compiler passes here are not cosmetic, they are how handlers get discovered and registered. Laravel's container is PSR-11 compatible, but that only solves get(), not service wiring. Second-order assumption: the bundle presumes a schema-first, event-sourced/CQRS domain model. If the target work is conventional CRUD or queue jobs, this is a heavy mismatch.
What changed in v5.0.0. The release is a single, unmitigated breaking change: Symfony 8.x required, PHP 8.5+ required. No features, no deprecations, no migration shims. This is a version-floor jump that simultaneously (a) invalidates every existing Symfony 6/7 deployment, (b) moves the package onto a PHP minor that is not yet in most managed runtimes or base images, and (c) pushes the package to the newest Symfony major on day one. It is the exact "deep transitive coupling / lockstep upgrades land on you" risk from the prior assessment, now materialised as fact rather than speculation.
Integration feasibility.
composer require of v5 will fail dependency resolution outright rather than requiring a hand-rolled shim. This removes option (c) below from consideration entirely — which is arguably a favour, since it was the option most likely to rot silently.Technical risk. Material, and increased by this release:
symfony/messenger transports you may not control) need to be Symfony-8-ready. On release week, expect gaps.Key questions.
pbjc codegen) as a first-class build step?Stack fit. Only justifiable in a Symfony service. A new Symfony 8 / PHP 8.5 service is now the only native fit for v5; every other combination is either pinned to v4 or unsupported.
Migration path. Do not retrofit this into an existing Laravel monolith. The realistic paths, in ascending order of cost and descending order of pragmatism:
.proto contracts. Keeps the architectural benefit, drops the framework mismatch. Now the default recommendation, since v5 has closed the shim option.Compatibility. Pin deliberately and record the decision in the ADR:
ext-protobuf availability in the runtime image (PHP-userland fallback exists but is slower), and transport pinning (symfony/messenger and/or AWS SQS/SNS adapters) against Symfony 8.Sequencing.
.proto, generate PHP classes, dispatch one command, handle one event. On v4 for existing hosts, on v5 for greenfield. This de-risks 80% of the unknowns.Maintenance. Low churn in steady state, high cost at upgrade time — and v5 demonstrates the cost is real and is paid on the vendor's schedule, not yours. Pin exact versions. Treat Symfony major upgrades as dedicated work items with their own budget line. Expect to read upstream source, because documentation is thin relative to the surface area and there is no v5 migration guide.
Support. Apache-2.0, no commercial SLA implied, community support effectively nil. Treat this as internally-owned OSS: assign a named maintainer and budget engineering days per quarter for dependency hygiene. v5 raises the stakes on one specific question: who keeps v4.x patched while you are unable to move to PHP 8.5? If the answer is "nobody", you have inherited a fork obligation that was not previously visible.
Scaling. The bundle is not the bottleneck — it is a thin wiring layer. Throughput, backpressure, and ordering are properties of the chosen transport and the event store. Operational work that matters is per-handler idempotency, consumer concurrency tuning, and partitioning strategy — all of which you own. Unchanged by v5.
Failure modes (ranked by likelihood × impact):
Ramp-up. Engineers need three competencies that rarely overlap: PBJ schema authoring, pbjx bus semantics, and Symfony DI internals. Realistic ramp is 1–2 sprints before a competent engineer is productive, and higher than usual because documentation scarcity pushes learning into source reading. v5 adds a fourth, unwelcome competency: tracking Symfony major-version migration details yourself, since no community corpus exists to lean on. On a Laravel team, add the framework-context cost on top.
Bottom line. v5.0.0 changes the verdict from "cautious maybe if you are in the gdbots ecosystem" to "only viable for greenfield Symfony 8 / PHP 8.5 services, and only once your platform supports that floor." For every other scenario — Laravel hosts, Symfony 6/7 hosts, teams without a Symfony 8 upgrade budget — the release narrows the usable surface rather than expanding it. It also removes the Laravel shim option outright, which sharpens the recommendation: adopt the pattern, not the package. Run the schema-toolchain spike only if interop with an existing gdbots/Triniti system is a stated requirement and the PHP 8.5 platform check passes; if interop is not a requirement, decline and document the framework mismatch as the deciding factor. If interop is required but the platform is not ready, pin to v4.x, get a written statement on its support horizon, and treat the eventual jump to v5 as a separately-funded migration project rather than a routine dependency bump.
How can I help you explore Laravel packages today?