dragon-code/laravel-route-names
Automatically generates names for your Laravel routes based on controller classes and methods, so you never name routes by hand. Keeps naming consistent across your app, makes refactoring safer, and works alongside your existing route definitions.
What it does. dragon-code/laravel-route-names hooks into Laravel's route registration lifecycle and derives route names automatically from the route definition (typically controller/action or URI shape), removing the need to hand-write ->name('users.index') on every route. Value is purely developer-ergonomics: less boilerplate, more consistent naming across a large route surface.
What changed in 2.2.0. One functional commit: Laravel 13 compatibility (#58). The remaining three entries (#54, #56, #57) are README banner and preview-image changes, two of them authored by a bot. There are no feature additions, no deprecations, no breaking changes, and — critically — no changes to naming derivation, collision handling, precedence over explicit ->name(), or route-cache behavior. The release is a compatibility bump and nothing more.
Revised read on upstream status. The prior assessment treated the package as archived and therefore dead. 2.2.0 partially contradicts that: the maintainer is still shipping, and has pre-emptively added Laravel 13 support rather than letting the package rot. The correct characterization is now compatibility-only maintenance by a single maintainer, not abandonment. That is a meaningful downgrade of the "dead dependency" risk — but it is not a clean bill of health. It answers "will it break on the next Laravel major?" with "probably not, promptly." It does not answer any of the substantive questions about correctness, which remain untouched by this release.
Architecture fit. Unchanged. A standard Laravel service provider with a small footprint — low coupling, contained install-time blast radius. The concern is where it sits: route names are a framework-level contract consumed by route(), URL generation, signed URLs, redirects, and assertRouteIs. A package that mutates that contract on every boot operates in a high-leverage, high-risk seam despite its small code size. A compatibility-only release does not reduce the leverage of that seam.
Integration feasibility. Unchanged and trivial: composer require, optional config publish, opt-in per route file or globally. No database, no migrations, no queue or cache dependency. An engineer can evaluate it in an afternoon.
Technical risk — the release improves one item and leaves the rest intact:
->name() calls, the failure is silent — wrong URLs, broken signed URLs, and green tests asserting the wrong thing. Nine minor versions in, undocumented collision behavior is a stronger signal than it was before.Key questions to resolve before adoption:
->name()? Is precedence configurable? (Unanswered by 2.2.0.)php artisan route:cache with identical output to uncached boot? (Unanswered by 2.2.0.)route:list look like afterward — is the route table still reviewable in code review?Recommendation: still do not take a runtime dependency. Consume it as a one-time scaffolding tool. The release does not change the calculus — it removes the "abandonware" objection and leaves the "unvalidated, single-maintainer, undocumented-collision-semantics" objections standing.
Stack fit. Reasonable for a conventional Laravel monolith or modular monolith with a large, convention-driven route surface. Poor fit for anything with a JS route bridge, public API versioning, or route names treated as a stable contract.
Migration path (preferred, unchanged):
->name() calls and commit them.composer.json.This yields the consistency benefit with zero ongoing dependency and makes route names visible in code review — which is the property we actually want. The fact that upstream now supports Laravel 13 does not change the fact that the output is static and the dependency is avoidable.
Migration path (fallback, if runtime generation is genuinely desired). Previously: fork-and-own was mandatory because upstream was archived. Revised: forking is no longer mandated by abandonment, but a lighter mitigation is now defensible — pin the exact version, add it to the dependency register with a named owner, subscribe to releases, and gate Laravel major upgrades on a 2.x release that covers the new major. Given the package's demonstrated willingness to ship major-version support, "vendor with monitoring" is a reasonable substitute for "fork and own," provided collision semantics are resolved first (see sequencing). If the semantics cannot be established by inspection, revert to fork-and-own.
Compatibility and sequencing.
route:list output before and after; any delta must be explainable.->name() override case in the pilot and record the observed behavior. These are the two questions the release did not answer and cannot be resolved by changelog.route:cache in CI.Maintenance. The archived-status objection is downgraded. Residual obligation: watch releases (low volume — one functional commit this cycle), gate Laravel major upgrades on a corresponding package release, and periodically review generated names as controllers are refactored. The real cost is not patching, it is the absence of anyone else exercising the code — we would be among the only production consumers, so we would find the bugs.
Support. Still no meaningful upstream issue triage or release-note depth beyond commit titles. Internal ownership must be explicit — a named team and a line in the dependency register. The single-maintainer dependency should be recorded as a bus-factor risk regardless of how thin the integration is.
Scaling. Boot-time cost is negligible even at a few thousand routes. The scaling risk is organizational and unchanged: as more modules and teams add routes, the probability of a generated-name collision rises, and collisions are silent. Any global naming scheme becomes a coordination point — a team cannot rename a controller method without potentially breaking another team's URL generation. A Laravel 13 compatibility bump does nothing for this.
Failure modes to instrument:
route() calls in JS breaking on backend refactor (if Ziggy is present).route('horizon.index') will not find it.Ramp-up. Engineer ramp-up is minutes — idiomatic Laravel, thin API. The hidden cost is tribal knowledge: developers must internalize the naming derivation rules to predict what name a route will receive. With hand-written names that knowledge lives in the file; with generation it lives in the package source. The package remains lightly documented — the 2.2.0 diff added banner images, not docs — so this is a durable onboarding tax for a modest boilerplate reduction.
Bottom line. 2.2.0 is a compatibility commit, not a capability or correctness release. It retires the strongest argument against the package — abandonment — and leaves every other one intact: no dependents, no ecosystem stress-testing, undocumented collision and override semantics, and a single maintainer whose cadence is "keep it compiling." The decision does not flip. Harvest the naming output once, commit it explicitly, and keep it out of production. If a team insists on runtime generation, the bar is now "demonstrate collision and override behavior in a pilot" rather than "find a maintained fork."
How can I help you explore Laravel packages today?