Laravel’s routing system is one of its core strengths, providing an elegant way to define and handle application routes. While php artisan route:list is a great tool for listing routes, it’s not always convenient when debugging in code or during automated testing.
To address this, let’s build a utility function, routes, that retrieves all registered routes in a structured format. This function is especially useful for testing or debugging complex route setups.
Support my mission to empower the developer community by sponsoring my work—your contributions help me build and share valuable tools, insights, and resources: Learn more here.
Why Use the routes Function?
When working on tests or debugging route configurations, you might need to:
- Verify that specific routes exist.
- Check route names, URIs, or methods programmatically.
- Debug routes without relying on Artisan commands or running them outside the test environment.
The routes function provides a simple, reusable way to access and inspect routes in your application.
The routes Function
Here’s the implementation:
use Illuminate\Support\Facades\Route;
if (!function_exists('routes')) {
/**
* Retrieve all registered routes for debugging in a structured format.
*
* @param bool $dump Whether to dump the routes to the console.
* @return \Illuminate\Support\Collection A collection of routes with details.
*/
function routes(bool $dump = false)
{
$routes = collect(Route::getRoutes())->map(function ($route) {
return [
'uri' => $route->uri(),
'name' => $route->getName(),
'action' => $route->getActionName(),
'methods' => $route->methods(),
];
});
if ($dump) {
dump($routes); // Dumps routes to the console
}
return $routes;
}
}
How to Use the routes Function
-
Debugging Routes in a Test:
Use the function in a test to inspect all registered routes:
it('retrieves all routes for debugging', function () { $all_routes = routes(true); // Dumps routes to the console $route_names = $all_routes->pluck('name')->all(); expect($route_names)->toContain('home'); expect($route_names)->toContain('dashboard'); }); -
Customising Route Output:
Filter or transform the routes as needed:
it('retrieves only POST routes', function () { $post_routes = routes() ->filter(fn($route) => in_array('POST', $route['methods'])); expect($post_routes->count())->toBeGreaterThan(0); }); -
Inspecting Routes in Development:
Create a debugging route in your application to view all routes in JSON format:
Route::get('/debug-routes', function () { return routes(); // Returns all routes as a JSON response });
Example Output
Calling routes(true) will display something like this:
[
{
"uri": "home",
"name": "home",
"action": "App\Http\Controllers\HomeController@index",
"methods": ["GET", "HEAD"]
},
{
"uri": "dashboard",
"name": "dashboard",
"action": "App\Http\Controllers\DashboardController@index",
"methods": ["GET", "HEAD"]
},
...
]
This structured output makes it easier to inspect and debug your routes.
Benefits of routes
- Convenient Debugging: Quickly view and debug routes without leaving the code.
- Improved Test Coverage: Validate your routes programmatically during testing.
- Reusable Utility: Easily integrate into any Laravel project for route inspection.
Conclusion
The routes function is a lightweight and flexible helper for inspecting Laravel routes in a programmatic way. Whether you're debugging in development or validating routes during testing, this function simplifies your workflow and eliminates guesswork.
What do you think of the routes function? Let me know how you use it in your projects, and don’t forget to share this post with others!
Support my mission to empower the developer community by sponsoring my work—your contributions help me build and share valuable tools, insights, and resources: Learn more here.
Photo by Codioful (Formerly Gradienta) on Unsplash
Top comments (4)
I like the way you are thinking. But getting all the routes for every route test is wasteful in my opinion.
artisan route:listhas a--jsonoption. And you can filter the routes list with other options. So all you need to do is$json = shell_exec('php artisan route:list --json'/* and extra filters if needed*/). That returns a json object you can use as you please.I would not prefer to use
shell_execactually, just rely on any internal PHP classes.But your approach using the
route:list, can be done in the helper:Where
--pathcan be add as optional argument in the helper.The
Illuminate\Support\Facades\Routeclass actually in theroute:listcommand if you drill down a bit more theroute:listcommand.Artisan::calldoesn't return the output. It returns the exit code.The sentence; I would not prefer to use shell_exec actually, just rely on any internal PHP classes, puzzles me. Do you mean you prefer to use Laravel classes over php functions?
Hi,
Thanks for sharing.
I am trying to debug this:
The execution point arrives to this code line, but if I put a breakpoint within MsageController - verifyWebhook, doesn't trigger the debug mode
Some idea