jrm/request-bundle
jrm/request-bundle is a Symfony bundle that streamlines HTTP request handling, giving you a structured way to validate incoming data, map parameters to typed objects, and keep controllers thin. Drop-in integration and sensible defaults make it easy to adopt in existing projects.
Architecture fit — the stack question is now closed, and it closes against adoption. Release 0.3.3 confirms the original read: this is a Symfony bundle, not a Laravel package. The brief's framing should be corrected in the record. More importantly, the release sets the platform floor at Symfony 7.2 and above, exclusively ("7.2 and higher only"). That single constraint removes the only scenario in the prior assessment that had a genuine gap to fill.
Restating the decision tree with the new constraint applied:
MapRequestPayload / MapQueryString are mature and first-party.The package's supported surface is now a strict subset of the range in which the framework already solves the problem natively. There is no version of Symfony on which this dependency is both installable and additive. That is a stronger conclusion than the prior assessment reached — it is no longer a judgement call about overlap, it is a structural redundancy.
Integration feasibility — unchanged at "low and not worth the glue," now for a simpler reason. We would be writing a service provider and resolver wiring to duplicate a first-party attribute on a Symfony version that ships the attribute. The prior assessment's fallback — "if the gap is real, write the ~100-line resolver in-house" — becomes the only viable path, because the package cannot be installed anywhere the gap might exist.
Technical risk — high and, on the release-discipline axis, higher than before. Two signals moved:
0.3.2 → 0.3.3 with a change that drops all Symfony versions below 7.2. Under 0.x semver a patch bump conventionally signals compatibility-safe change; this is not. Any consumer on 7.0/7.1 upgrading "safely" would hit a composer constraint failure at best. It is a small ecosystem and a small package, so this is not a crisis — but it is a reliable indicator of how the maintainer thinks about backward compatibility, and that thinking will apply to future releases we would depend on.Maturity signals are marginally better than recorded — there is now a visible 0.3.2 → 0.3.3 progression and at least one outside contributor, so the "single release, possibly abandoned on arrival" framing was slightly pessimistic. That does not offset the narrowing. Refresh stars/dependents before finalising, but the direction of travel is clear: the project is being actively narrowed, not broadened.
Key questions (revised — most are now moot, two are not):
MapRequestPayload on priority ordering, given both now target the same Symfony versions? (Academic if we do not adopt.)Stack fit — decision tree now collapses to two branches.
FormRequest plus typed DTOs via container binding. Unchanged, and the 0.3.3 release notes remove any remaining ambiguity about this being a Symfony artifact.MapRequestPayload. There is no third branch.Migration path. Not applicable — nothing to migrate from, and no adoption path to migrate along. The prior assessment's "internal seam" guidance (own interface, package as one implementation behind it) remains good engineering advice for request-object mapping generally, but it is no longer a mitigation for this dependency because the dependency is not entering the codebase.
Compatibility. This is where the release is decisive. Check our supported Symfony matrix: if it includes 6.4 LTS — and for most estates it will — then the package's constraint (^7.2) excludes the majority of our fleet. The remaining services on 7.2+ already have a first-party equivalent. The compatibility story is not "narrow," it is "disjoint from our needs."
Sequencing.
Maintenance. Upstream maintenance capacity is small but not zero — the project is alive. The problem is not liveness, it is direction: the maintainer is optimising for currency on their own stack, and the 0.3.3 patch release demonstrates willingness to drop platform support without a major version. Had we adopted 0.3.2, this release would have stranded us on Symfony ≤7.1 with a composer update as the failure trigger. We did not adopt, so the exposure is zero — but it is the clearest available evidence of what owning this dependency would have meant. We would have owned a fork by policy, not by exception.
Support. Unchanged: GitHub issues, no SLA, no vendor, no documented security disclosure process. The contributor credit is mildly reassuring about bus factor; it does not create an escalation path. For a component on the request path, that remains an unacceptable support posture regardless of version support.
Scaling. Unchanged and still a non-issue. Per-request reflection and deserialization, stateless, no shared cache or connection pool. This package would never have been the throughput bottleneck; the risk was always correctness and ownership.
Failure modes. The 0.3.3 change adds one and retires the rest:
composer update fails or, worse, silently resolves to an older pinned tag, leaving two services on different mapping code paths. This is now the headline failure mode and it is release-management-driven, not code-driven.MapRequestPayload after a framework upgrade — not reachable.Ramp-up. No change in the technical learning curve, and no longer relevant. The remaining organisational cost is trivial: a short note closing the evaluation and correcting the "Laravel/PHP package" premise in the intake record so the same package is not re-queued next quarter. That is a fifteen-minute write-up, and it is the only work this release should generate for us.
Bottom line for the steering decision: 0.3.3 is a narrowing release that eliminates the sole condition under which adoption was defensible. The package now supports only Symfony versions on which the framework's own request-mapping already exists, and cannot be installed on the LTS most of our services run. Recommendation stands and hardens: close as "not adopted — covered natively," cancel the spike, and treat the revisit condition as expired by upstream action rather than ours. Re-open only if the maintainer reintroduces a 6.4 LTS branch and a concrete gap is demonstrated against MapRequestPayload — neither of which is on the current trajectory.
How can I help you explore Laravel packages today?