migrify/symfony-route-usage
Symfony Route Usage scans your Symfony app to find routes that are never referenced anywhere in your code, helping you spot dead endpoints and clean up routing config. It reports unused routes so you can safely remove them, keeping your route definitions lean and your application easier to maintain.
Architecture fit — poor as a direct dependency. migrify/symfony-route-usage is a Symfony Bundle. It expects Symfony's Kernel, RouteCollection, DI container extension registration, and event dispatcher. Laravel exposes Illuminate\Routing\RouteCollection and a middleware pipeline with no bundle/container-extension analogue. There is no adapter path — it cannot be installed into a Laravel app and "just work."
Mechanism (as inferred). The package detects used vs. unused routes by instrumenting request handling and persisting route hits to storage, then diffing observed routes against the registered route table. That model is sound and portable in principle; only the implementation is Symfony-bound.
Integration feasibility — low for this artifact, high for the concept. The realistic options are: (1) port the concept to Laravel middleware, (2) adopt a Laravel-native equivalent (e.g. spatie/laravel-route-usage, which implements the same idea on Laravel's pipeline), or (3) run this package only in Symfony services that remain in the fleet, and align reporting across both.
Technical risk — high. The repo sits under deprecated-packages/, has 0 stars, 0 dependents, and a composite score of 0. That means no CVE pipeline, no Symfony 6/7 compatibility work, no bug triage, and unknown PHP version bounds. It is effectively source-available reference code, not a maintained dependency. The only durable option is to fork and own it.
Key questions for the vendor/owner
Stack fit. Treat this repository as a design reference, not a dependency. For the Laravel estate, implement the same capability natively: enumerate routes via Route::getRoutes(), attach a terminal middleware that records route.getName() (or the URI pattern) into a bucketed store, and periodically reconcile the observed set against the registered set. Aggregate per route per day rather than per request.
Migration path. Two tracks in parallel:
If both tracks run, converge on a shared reporting schema (route identifier, service, hit count, first/last seen) so coverage metrics are directly comparable across stacks.
Compatibility checks before any commitment
Sequencing
Deprecation/Sunset headers and a minimum observation window.Maintenance. Zero upstream. Budget an owner and roughly a sprint of engineering to fork or reimplement, plus ongoing ownership of the storage schema and retention job. This is not a "install and forget" line item.
Support. No vendor, no SLA, no security advisories. Any CVE in its transitive dependencies becomes our problem to detect and patch. For a package with zero dependents, assume it has never been exercised outside its author's environment.
Scaling. Per-request instrumentation is a write amplification problem. At meaningful traffic this produces millions of rows for a dataset whose useful resolution is "was this route hit in the last 90 days." Mitigate with in-process aggregation, sampling (10–20% is sufficient for coverage questions), a queue-buffered writer, and a hard retention window. Index on route identifier and date. The middleware must be excluded from health checks and asset routes to avoid skewing results.
Failure modes — the material risk is false "unused" classifications.
Ramp-up. Conceptually low (half a day for an engineer to understand); operationally medium (two to three weeks to make a fork trustworthy enough to justify deletions). The gating work is route naming discipline and the deprecation policy, not the code.
Recommendation. Do not adopt as a dependency. Extract the concept, implement or adopt the Laravel-native equivalent, and gate all removals behind an explicit observation window longer than your slowest business cycle with an owner sign-off step.
How can I help you explore Laravel packages today?