netojose/laravel-api-explorer
Laravel API Explorer gives Laravel apps a built-in UI for browsing registered API routes, inspecting HTTP methods, URIs, middleware, and controller actions, and testing endpoints. It helps developers understand, debug, and document APIs faster without extra tooling.
What it is. netojose/laravel-api-explorer is a dev-facing introspection utility that reads Laravel's registered route collection and renders an in-browser, Postman-style console at a configurable URI (typically /api-explorer). It lets a developer pick a route, fill in path/query/body parameters inferred from the URI pattern, and fire the request against the same application instance. It is not a documentation generator, not an OpenAPI/Swagger emitter, and not a mocking or contract-testing tool — it is a request runner bolted onto the framework's router.
Architecture fit. The integration surface is intentionally shallow, which is its main virtue: one service provider, one config file, a handful of Blade views, and a read of Route::getRoutes(). It introduces no runtime coupling to domain code and no database migrations, so it does not pollute the application's architectural boundaries. The trade-off is that the shallow design is also the ceiling — parameter inference is string-parsing on route URIs, so anything requiring schema knowledge (typed request bodies, nested resources, enum constraints, auth header acquisition, file uploads, pagination semantics) is either manual or unsupported. For a Laravel team whose APIs are largely simple REST verbs over URI parameters, that is adequate; for anything contract-first, it is not.
Integration feasibility. Mechanically trivial — a composer require --dev, package auto-discovery registers the provider, and the console appears. The real feasibility question is version compatibility, and here the answer is poor. The last release was 2019-12-12, which places it in the Laravel 5.8–6.x window. Modern Laravel (9/10/11) has since moved through PHP 8 type strictness, Blade component changes, the Route/Router contract evolution, and Symfony 5/6/7 alignment. Expect at minimum an unconstrained illuminate/support version pin conflict, and plausibly fatal errors in the route-action reflection path when encountering closure routes, invokable controllers, or Enum/BackedEnum route parameters. A compatibility spike is mandatory before any commitment.
Technical risk. Three material risks:
NOASSERTION means the repository metadata does not declare a recognized license. For an internal dev tool the practical exposure is low, but it fails most corporate OSS intake gates and cannot be vendored into a distributed product without legal review of the actual LICENSE file.Key questions for the spike.
Route::resource, Route::apiResource, invokable controllers, route-model-bound parameters, Route::fallback?LICENSE file in the tree, and does it clear our OSS policy?php artisan route:list?Verdict. Technically low-risk to try, high-risk to depend on. It solves a real ergonomics problem (clicking through your own API without leaving the app) that is otherwise served by Postman, Insomnia, or a generated OpenAPI spec — all of which are maintained. The exploration value is real; the maintenance value is negative.
Stack fit. Best fit is a Laravel 5.8–6.x monolith or modular monolith with a hand-rolled REST API and a small team that already thinks in terms of "hit the route and see what comes back." It fits poorly if the organization is contract-first (OpenAPI as source of truth), if the API is consumed by external partners, or if the platform standard is Laravel 10/11 — in which case the compatibility work likely exceeds the utility.
Migration path. Treat this as a developer-tooling addition, never an application dependency:
composer require netojose/laravel-api-explorer --dev on a throwaway branch.illuminate/* requirements in composer.json and verify the provider still boots.'enabled' => app()->environment('local') combined with an explicit auth middleware or IP allowlist. Do not rely on a single gate.Route::middleware(['web','auth']) group and confirm it is absent from the production route table via php artisan route:list.Compatibility. Validate against the exact minor versions in composer.lock, not the major. Pay specific attention to: Blade directive deprecations in the published views, Route::getRoutes() iteration behavior with cached routes (route:cache in a local environment is a known foot-gun), and PHP 8 handling of null in parameter inference. Confirm behavior with php artisan route:cache both on and off — a tool that silently shows a stale route list is worse than no tool.
Sequencing. Do not run this in parallel with anything else. Order:
local.Maintenance. Effectively total. With no release since 2019, every Laravel major upgrade becomes our patch to write, and every fix lives in a fork that we must keep rebased. Budget it as an owned internal tool from day one, not as a consumed dependency. Realistically this is 2–5 days per year of reactive work plus unbounded risk in a Laravel upgrade cycle — cheap in absolute terms, but it is our cheap, and it competes with work that actually ships.
Support. None. No maintainer response path, no issue triage, no security disclosure channel. Internal support means the adopting squad owns it and documents it. The NOASSERTION license metadata means the tool may also be blocked by legal/procurement before it ever reaches a developer laptop, so confirm license clearance before the spike, not after.
Scaling. Scales in the dimension that matters (it's a local dev tool; there is no production load) and fails in the dimension that matters more: it does not scale across API complexity. Parameter inference degrades on nested resources, polymorphic bodies, file uploads, pagination, and anything requiring request-schema awareness. A team with 20 routes gets real value; a team with 400 routes across 30 controllers gets a flat, undifferentiated list and will go back to Postman within a sprint. Also note the route-list rendering cost on very large route tables — it enumerates and reflects over every registered route on page load.
Failure modes. Ranked by severity:
| Failure | Trigger | Impact | Mitigation |
|---|---|---|---|
| Explorer exposed publicly | Config gate missed in staging/prod deploy | Unauthenticated request console against every route — full auth-surface abuse | Environment predicate + auth middleware + CI route-list assertion |
| Stale route list | route:cache active locally |
Explorer shows removed/changed routes; developer tests against phantom API | Document route:clear requirement; assert cache state |
| Boot failure on upgrade | Laravel/PHP major bump | Tool silently absent or app-wide fatal if provider throws | --dev install only; CI smoke test on upgrade branches |
| Misleading parameter model | Complex request bodies | Developer sends malformed requests, misdiagnoses API bugs | Scope the pilot to simple REST routes only |
| License/procurement block | OSS intake review | Evaluation wasted after engineering spend | Legal check first |
Ramp-up. Near zero for the developer — the UI is self-explanatory to anyone who has used Postman, which is the entire point and the entire value proposition. Ramp-up cost sits with the platform team, who must own compatibility, guardrails, and the eventual fork. That asymmetry is the crux of the assessment: the benefit is diffuse and per-developer, the cost is concentrated and permanent.
Recommendation. Fund a two-day spike, gated on license clearance and Laravel version compatibility, with a pre-committed decision to walk away if either fails. Given the six-year release gap and the existence of maintained alternatives (Scramble for OpenAPI generation, Scribe for documentation, or a scripted Postman collection export from the route table), the expected outcome is that this package informs the requirements for a small internal tool rather than becoming one. It is a good idea, well executed for its era, and no longer a defensible dependency.
How can I help you explore Laravel packages today?