如何取得 Laravel 已登记的路线清单?

我希望找到一种方法来创建一个数组,其中包含 Laravel 4中已注册的路径路径。

基本上,我希望得到一个类似这样的列表返回:

/
/login
/join
/password

我确实遇到过一个方法 Route::getRoutes(),它返回一个包含路由信息和资源的对象,但是路径信息是受保护的,我不能直接访问这些信息。

有没有其他方法可以达到这个目的? 也许是另一种方法?

154178 次浏览

Route::getRoutes() returns a RouteCollection. On each element, you can do a simple $route->getPath() to get path of the current route.

Each protected parameter can be get with a standard getter.

Looping works like this:

$routeCollection = Illuminate\Support\Facades\Route::getRoutes();


foreach ($routeCollection as $value) {
echo $value->getPath();
}

You can use console command:

Laravel 4 as asked in question

php artisan routes

Laravel 5 more actual

php artisan route:list


Helpers (Laravel 4) :

Usage:
routes [--name[="..."]] [--path[="..."]]


Options:
--name                Filter the routes by name.
--path                Filter the routes by path.
--help (-h)           Display this help message.
--quiet (-q)          Do not output any message.
--verbose (-v|vv|vvv) Increase the verbosity of messages: 1 for normal output, 2 for     more verbose output and 3 for debug
--version (-V)        Display this application version.
--ansi                Force ANSI output.
--no-ansi             Disable ANSI output.
--no-interaction (-n) Do not ask any interactive question.
--env                 The environment the command should run under.

I created a route that will list each route and its respective details in an html table.

Route::get('routes', function() {
$routeCollection = Route::getRoutes();


echo "<table style='width:100%'>";
echo "<tr>";
echo "<td width='10%'><h4>HTTP Method</h4></td>";
echo "<td width='10%'><h4>Route</h4></td>";
echo "<td width='10%'><h4>Name</h4></td>";
echo "<td width='70%'><h4>Corresponding Action</h4></td>";
echo "</tr>";
foreach ($routeCollection as $value) {
echo "<tr>";
echo "<td>" . $value->getMethods()[0] . "</td>";
echo "<td>" . $value->getPath() . "</td>";
echo "<td>" . $value->getName() . "</td>";
echo "<td>" . $value->getActionName() . "</td>";
echo "</tr>";
}
echo "</table>";
});

if you have compiled routes like /login/{id} and you want prefix only:

foreach (Route::getRoutes() as $route) {
$compiled = $route->getCompiled();
if(!is_null($compiled))
{
var_dump($compiled->getStaticPrefix());
}
}

A better way to get it readable is to register a route and print it in web browser with the artisan output directly

Route::get('routes', function() {
\Artisan::call('route:list');
return \Artisan::output();
});

For Laravel 5, you can use artisan command

php artisan route:list instead of php artisan routes.

//Laravel >= 5.4


//Controller index()
$app = app();
$routes = $app->routes->getRoutes();
return view ('Admin::routes.index',compact('routes'));


//view
<table id="routes-table" class="table table-bordered table-responsive">
<thead>
<tr>
<th>uri</th>
<th>Name</th>
<th>Type</th>
<th>Method</th>
</tr>
</thead>
<tbody>
@foreach ($routes as $route )
<tr>
<td>\{\{$route->uri}}</td>
<td>\{\{$route->getName()}}</td>
<td>\{\{$route->getPrefix()}}</td>
<td>\{\{$route->getActionMethod()}}</td>
</tr>
@endforeach
</tbody>
</table>

Console command for those who use Oh-my-zsh with Laravel 5 plugin

la5routes
$routeList = Route::getRoutes();


foreach ($routeList as $value)
{
echo $value->uri().'<br>';
}


use Illuminate\Support\Facades\Route;

On Laravel 5.4, it works, 100 %

For Laravel 5.4.* This code works fine.

Route::get('routes', function() {
$routeCollection = Route::getRoutes();


echo "<table style='width:100%'>";
echo "<tr>";
echo "<td width='10%'><h4>HTTP Method</h4></td>";
echo "<td width='10%'><h4>Route</h4></td>";
echo "<td width='10%'><h4>Name</h4></td>";
echo "<td width='70%'><h4>Corresponding Action</h4></td>";
echo "</tr>";
foreach ($routeCollection as $value) {
echo "<tr>";
echo "<td>" . $value->methods()[0] . "</td>";
echo "<td>" . $value->uri() . "</td>";
echo "<td>" . $value->getName() . "</td>";
echo "<td>" . $value->getActionName() . "</td>";
echo "</tr>";
}
echo "</table>";
});

Code

Laravel <= 5.3

/** @var \Illuminate\Support\Facades\Route $routes  */
$routes = Route::getRoutes();
foreach ($routes as $route) {
/** @var \Illuminate\Routing\Route $route  */
echo $route->getPath() .  PHP_EOL;
}

Laravel >= 5.4

/** @var \Illuminate\Support\Facades\Route $routes  */
$routes = Route::getRoutes();
foreach ($routes as $route) {
/** @var \Illuminate\Routing\Route $route  */
echo $route->uri. PHP_EOL;
}

Artisan

Laravel 4

php artisan routes

Laravel 5

php artisan route:list

Improving @jeanfrg's answer

It has a few deprecated functions. It shows error while editing an answer, hence posting it here.

Laravel 6, 7 & 8

Put it inside routes/web.php

Route::get('routes', function () {
$routeCollection = Route::getRoutes();


echo "<table style='width:100%'>";
echo "<tr>";
echo "<td width='10%'><h4>HTTP Method</h4></td>";
echo "<td width='10%'><h4>Route</h4></td>";
echo "<td width='10%'><h4>Name</h4></td>";
echo "<td width='70%'><h4>Corresponding Action</h4></td>";
echo "</tr>";
foreach ($routeCollection as $value) {
echo "<tr>";
echo "<td>" . $value->methods()[0] . "</td>";
echo "<td>" . $value->uri() . "</td>";
echo "<td>" . $value->getName() . "</td>";
echo "<td>" . $value->getActionName() . "</td>";
echo "</tr>";
}
echo "</table>";
});

Demo: Access it via <url>/routes

Output demo

Not all the routes are available all the time.

For example if you want to get the routes from the RouteServiceProvider then you might need to use the booted callback:

    $this->booted(function () {
dump(Route::getRoutes());
}