dentro/yalr
YALR (Yet Another Laravel Roles) is a lightweight roles and permissions package for Laravel. Assign roles to users, attach permissions to roles, and check abilities through simple methods, middleware, and Blade directives.
Architecture fit. dentro/yalr is a convention layer over Laravel's existing router: it lets you express routes as classes instead of entries in routes/web.php or routes/api.php. It does not replace the dispatcher, so middleware, route-model binding, form requests, and policies remain framework-native — assuming the package is a thin adapter. That makes it an application-layer pattern (like invokable controllers or spatie/laravel-route-attributes) rather than an infrastructure commitment. Architecturally cheap to say yes to; the risk is convention drift, not coupling.
Integration feasibility. Low. Typical shape is composer require dentro/yalr, register a service provider, publish a config file pointing at a discovery directory. That is hours, not weeks, and is reversible. The real feasibility question is not "can we install it" but "does it survive contact with route:cache, route:list, route() URL generation, and the Laravel 11+ bootstrap/app.php routing model."
Technical risk. High relative to the value delivered — but materially lower than the prior assessment, on one axis.
route:cache. Unchanged by this release and still must be measured, not assumed.composer.json between v1.5.0 and v1.6.0 before anything else.Key questions to answer before any code is written:
routes/web.php, or does it take over route registration? Can I run both in one app?php artisan route:cache work, and does the cached output match the uncached output byte-for-byte?->name() preserved? Does route('x') still resolve?withoutMiddleware expressed — per class, per method, via attributes, or config?composer.json constraints as of v1.6.0 — did Laravel 10/11 support get dropped to make room for 13? Is there a CI matrix proving all currently claimed majors, including 13?composer.json?Route:: calls?Stack fit. Unchanged. Treat this as a developer-ergonomics choice inside a single bounded context, not a platform decision. It fits a team that already thinks in "one class per endpoint" (action/handler style) and is comfortable with attribute-driven configuration. It fits poorly on a team that has standardized on resource controllers and Route::resource, because you will end up with two idioms in one codebase and reviewers will have to context-switch.
Migration path. Do not migrate. Coexist.
routes/web.php and routes/api.php untouched.route:list and that there are no collisions or ordering surprises.Compatibility checks (blocking gates).
route:cache / route:clear round-trips cleanly, and diff route:list before and after.Sequencing.
composer.json diff. This is cheap and it either clears the maintenance concern or escalates it.route:cache behavior, and developer time-to-first-endpoint versus an invokable controller.spatie/laravel-route-attributes — the incumbent in this niche with real adoption. Notably, the incumbent also supports current Laravel majors, so v1.6.0 closes the one gap where YALR had a defensible argument. That strengthens the default-to-incumbent position rather than weakening it.Maintenance. Improved but not resolved. The v1.6.0 release is the first evidence that the maintainer tracks Laravel majors, which was the single biggest "package quietly dies" risk in the prior assessment. Keep the pin exact anyway, and keep the 12-month vendor/fork budget — one release is a data point, not a track record. Add the constraint diff to the quarterly upstream review; the question to ask each cycle is no longer "is anyone home?" but "did the last release drop a major without a major version bump?"
Support. MIT, community only, no vendor, no SLA, no security disclosure process visible. Unchanged. Acceptable for a dev-time convenience layer that fails loudly at boot; not acceptable if the package ends up on the request path in a way that can fail silently at runtime. Keep the blast radius to registration-time behavior.
Scaling.
route:list and cache build time, but at realistic scale (hundreds of routes) this is noise.Failure modes to monitor.
composer update fails or, worse, when it succeeds and behavior shifts.Route:: entries — ordering is registration-order dependent and easy to get wrong.Ramp-up. One to two days per engineer to become productive, plus the cost of writing the internal guide that doesn't exist yet. Unchanged by this release. Mitigate with a single reference module, a documented "when to use route classes vs. controllers" rule, and a reviewer checklist. The honest TPM recommendation is unchanged but better informed: run the spike, benchmark it against spatie/laravel-route-attributes, and default to the incumbent. v1.6.0 removes the "it will die on the next Laravel major" objection — which was real — but it does not create a reason to prefer YALR over the incumbent, because the incumbent now matches it on framework coverage and beats it on adoption by two orders of magnitude.
How can I help you explore Laravel packages today?