theodo/accent-bundle
A small Symfony bundle from Theodo for handling accented characters in PHP applications. It provides utilities to strip or convert diacritics, useful for generating clean slugs, URLs, and search-friendly text.
Architecture fit — double mismatch, flag first. v3.1.0 confirms and sharpens what the prior assessment inferred: theodo/accent-bundle is not merely a Symfony bundle, it is a Symfony bundle scoped to API Platform. The release is entirely about which API Platform package is installed (api-platform/core vs api-platform/symfony), refuses to run without one, and actively blocks api-platform/core when it is pulled in as a dependency. Laravel has no bundle contract and no API Platform equivalent, so there are now two independent reasons nothing will execute: no bundle registration/compiler pass, and no API Platform resource graph to analyze. The package's value is the methodology — static verification that every API operation is covered by an access-control rule — not the code. That methodology is narrower than previously recorded: it is API-Platform-operation coverage, not generic route coverage. Treat it as a design reference only, and only for teams on the Symfony + API Platform stack.
Correction to prior scope. The earlier assessment described the value as general "every route covered by an access-control rule" checking. v3.1.0 makes clear the unit of analysis is the API Platform operation (resource/operation metadata), not the Symfony router. This reduces what is transferable to Laravel: the reusable semantics are the finding taxonomy and the CI gate shape, not the enumeration logic. Our internal build estimate is unchanged (5–10 dev days) but the borrowable surface is smaller — plan to design the Laravel route/gate enumeration from scratch.
Integration feasibility.
Technical risk.
api-platform/core is now prevented" is a Composer-level conflict/replace behavior — a package that constrains its siblings' resolution can break composer update in a monorepo or in a service with transitive API Platform dependencies. This is a semver-questionable change for a minor version: it alters install outcomes, not just runtime behavior. Pin exactly and test the resolver before rollout.Key questions for the team.
api-platform/core or api-platform/symfony? That choice now determines whether the bundle installs cleanly or conflicts.Recommendation: Do not adopt as a Laravel dependency — v3.1.0 reinforces this by narrowing the tool to API Platform. If we have a Symfony + API Platform service, this is now a viable 1–2 day pilot rather than a curiosity. For Laravel, budget a 1–2 day spike to read the checking logic and borrow its finding taxonomy, then build internally.
Stack fit. Greenfield for Laravel. The port needs three pieces: (a) a route enumerator resolving effective middleware including group inheritance and Route::middleware() chaining; (b) an authorization resolver inspecting Gate::define, Policy auto-discovery, authorizeResource, and controller authorize() calls; (c) an artisan command emitting a machine-readable report plus a non-zero exit code. Note the equivalent of API Platform's operation metadata does not exist in Laravel — route + middleware + gate is the closest analog, so do not attempt a literal semantic port.
Migration path. No incremental migration for Laravel — nothing is deployed, so this is a build decision. The conceptual lift is now narrower: adopt the bundle's finding taxonomy and CI-gate shape, not its enumeration model.
Compatibility.
core vs symfony) and its version, and config format (YAML vs attributes). Run composer update --dry-run in a representative skeleton to confirm the new conflict rule doesn't break resolution.Route::resource expansion, and route-level can: middleware.Sequencing.
Maintenance. Adopting the bundle means owning a fork the moment we patch it — and for a security control, we will patch it. Version-pin exactly (particularly given the composer conflict change in a minor release), vendor the diff, and assume upstream is dormant between releases. Internal build is more code but far less ownership ambiguity. Upstream is demonstrably active, which reduces — but does not remove — the dormancy assumption.
Support. Community-only, GitHub issues, no SLA, no visible CVE process. For a tool whose output feeds compliance evidence, "no support contract" is a governance finding to document and accept explicitly. Add a note that the project's supported-dependency policy changes between minor versions without a major bump.
Scaling. Favorable and unchanged — it is CI-time static analysis, not a runtime dependency. No production latency, no request-path blast radius, cost scales linearly with operation/route count. Still the strongest argument for building some checker.
Failure modes to instrument.
Route::resource expansions, package-injected routes, or sub-requests misclassified as protected → silent auth gap. Mitigate with a fixture suite of known-unprotected routes.route:list.api-platform/core breaking a shared Symfony skeleton or monorepo resolution. Test the resolver in CI before rollout; keep a rollback pin.Ramp-up. Low conceptual ramp (one paragraph: "every route must map to an authorization decision"). For a Symfony + API Platform team, hours — and v3.1.0's explicit failure message makes the initial install self-explanatory. For a Laravel team, the concept transfers immediately but the tool does not; onboard developers on the internal command's output format and publish the finding taxonomy so triage is consistent across teams.
How can I help you explore Laravel packages today?