mcfedr/uuid-paramconverter
Symfony param converter that turns UUID route parameters into Ramsey UUID objects before they reach your controllers. Type-hint UuidInterface and malformed or missing UUIDs are rejected automatically, with no manual parsing or validation boilerplate.
Architecture fit — critical mismatch, unchanged. Despite the "Laravel/PHP package" grouping, mcfedr/uuid-paramconverter remains a Symfony bundle, not a Laravel package. Release 4.2.0 does not alter this. It still wires three Symfony-specific extension points around ramsey/uuid:
SensioFrameworkExtraBundle's controller-argument conversion (route {id} → UuidInterface). Laravel has no equivalent concept; its analogue is Route Model Binding.UuidInterface ↔ string in JSON. Laravel ships its own serialization (API Resources / JsonSerializable / casts).In a genuine Laravel codebase this package is unusable without adopting large swaths of the Symfony ecosystem. Nothing in 4.2.0 changes that; the release is a dependency-floor bump, not a re-architecture.
What 4.2.0 actually changes. The only stated change is "drops support for older PHP and Symfony." That is a constraint-tightening release, and materially it moves the needle on two prior findings:
ramsey/uuid (v4) and Symfony 6.4/7. Raising the floor suggests the maintainer has modernised the constraint set, so installation on a current Symfony LTS is now plausible where it previously was doubtful. This must be verified with composer why-not on the target stack — the release note does not name a minimum PHP, minimum Symfony, or a ramsey/uuid range.Integration feasibility. For a Symfony shop: high and now more likely to install cleanly on a current stack, though the exit-planning caveat stands. For a Laravel shop: still low — treat as a reference implementation, not a dependency. The capability is trivially reproducible with native primitives (HasUuids/custom cast, Route::bind, Rule::uuid, API Resources).
Technical risk.
Key questions (revised).
ramsey/uuid versions in 4.2.0's composer.json? Read the manifest, not the changelog.ramsey/uuid objects, or ULIDs — and do we need framework-level normalization at all?Stack fit. Unchanged: native only to Symfony + ramsey/uuid + Symfony Serializer/Forms. Zero first-class fit for Laravel's request lifecycle. The "opportunity" score (~3.73) still reflects a desirable capability (clean UUID handling at HTTP boundaries) delivered by the wrong vehicle for a Laravel stack.
Migration path (Laravel). Do not adopt — 4.2.0 does not change the calculus, and the constraint-tightening arguably makes it worse by adding upgrade coupling. Reproduce the three capabilities natively:
Route::bind closure that constructs Uuid::fromString() and 404s on InvalidUuidStringException.RamseyUuidCast for Eloquent attributes and JsonResource output casting UUID to string.Rule::uuid() (or a custom rule wrapping Uuid::isValid) plus a request DTO hydrating UuidInterface.Same ergonomics, zero external dependency, full control over error semantics.
Migration path (Symfony, if applicable). The 4.2.0 release slightly improves the stopgap case if it genuinely supports Symfony 6.4/7 via argument resolvers — that would let you adopt with a viable forward path. Still isolate behind a thin internal interface so the ParamConverter/normalizer/form wiring can be swapped for native argument resolvers. Plan the exit before entry. If 4.2.0 does not clear the Symfony 7 floor, this path remains a dead end and should be closed.
Compatibility. Previously "expect friction on modern ramsey/uuid v4 and Symfony 6.4/7" — 4.2.0 appears to address this, but the release note is too terse to confirm. Re-run composer why-not against the target stack before committing; treat all prior compatibility conclusions as unverified until the 4.2.0 manifest is read. Also confirm forward support: does the package work with the next Symfony LTS, or only the current one?
Sequencing.
composer.json and diff — establish actual version floors and whether ParamConverter was replaced by argument resolvers.Maintenance. The single-maintainer, no-dependents picture is unchanged, but 4.2.0 is a positive signal: the maintainer is active and willing to modernise. Offsetting that, they shipped a breaking change as a minor version — so pin exactly (e.g. 4.2.0), never ^4.2, and review diffs before every bump. Budget for vendoring or a private fork remains prudent. For the Laravel path, the native replacement is ~100–200 LOC you own — materially lower long-term maintenance than an actively-churning external dependency.
Support. GitHub issues only; no commercial backing, no security response process, no published cadence. 4.2.0 does not add any of these. Treat as unsupported open source. Mitigating factor: MIT, small reviewable codebase.
Scaling. Runtime overhead is negligible (thin normalizer/form/param-converter glue). The real scaling concern remains orthogonal: UUID primary keys cause index fragmentation and larger indexes vs. auto-increment. That is a data-modelling decision, not this package's problem — flag separately if UUID PKs are planned at volume.
Failure modes.
Ramp-up. Small surface area (three classes of integration), readable source, so onboarding cost is low — for engineers who already know Symfony concepts. On a Laravel team, the conceptual translation cost (ParamConverter ≠ Route Binding, Symfony Forms ≠ FormRequests) still exceeds the cost of writing the native equivalent.
Recommendation. Do not adopt into a Laravel stack — 4.2.0 changes nothing here. Use it as a design reference for a small internal UUID utility. For an existing Symfony app, 4.2.0 improves the case for a pinned, isolated adoption by lowering install friction and demonstrating maintainer engagement — but only after verifying that the release replaced ParamConverter with argument resolvers. If it did not, the prior recommendation stands: build on native argument resolvers instead. Net position: the release is a modest positive for the Symfony path and neutral for the Laravel path; it does not change the headline verdict, but it does change what we must verify before deciding.
How can I help you explore Laravel packages today?