Як отримати список зареєстрованих шляхів маршруту в Laravel?


80

Я сподівався знайти спосіб створити масив із зареєстрованими шляхами маршрутів у Laravel 4.

По суті, я прагну повернути такий список:

/
/login
/join
/password

Я натрапив на метод, Route::getRoutes()який повертає об'єкт з інформацією про маршрути, а також з ресурсами, але інформація про шлях захищена, і я не маю прямого доступу до інформації.

Чи є інший спосіб досягти цього? Можливо, інший метод?


1
можливий дублікат відображення зареєстрованих маршрутів у Laravel 4
mniess

Відповіді:


122

Route::getRoutes()повертає a RouteCollection. На кожному елементі ви можете зробити простий $route->getPath()шлях до поточного маршруту.

Кожен захищений параметр можна отримати за допомогою стандартного геттера.

Цикл працює так:

$routeCollection = Route::getRoutes();

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

як ви переглядали колекцію?
Раджан Равал

Чи можу я використовувати це у власному помічнику?
poashoas

Реалізація @RajanRawal Collection, ArrayAccessяка дозволяє їм поводитися так само, як масиви, і використовуватись у foreach.
Ендрю Браун,

3
якщо ви віддаєте перевагу уникати фасадів, можете зробити ін’єкцію Illuminate\Routing\Router.
Ендрю Браун,

12
Про всяк випадок, якщо хтось вважає це корисним, з Laravel> = 5,5 ви можете використовувати: $routes = array_map(function (\Illuminate\Routing\Route $route) { return $route->uri; }, (array) Route::getRoutes()->getIterator());
siannone

61

Ви можете використовувати консольну команду:

Laravel 4, як задали питання

php artisan routes

Laravel 5 більше актуальний

php artisan route:list


Помічники (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.

32
Це php artisan route:listзараз
Марклар

Це справедливо для Laravel 5, але питання було для Laravel 4
Захарі Вайксельбаум


20

Я створив маршрут, який перелічить кожен маршрут та його відповідні деталі в таблиці html.

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>";
});

9
//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>

1
Чи можете ви, будь ласка, відредагувати свою відповідь і додати коротке пояснення про те, що вона робить і як це працює? Дякую!
Фабіо каже “Поновити Моніку”

@FabioTurati Ми просто отримуємо всі маршрути з getRoutes()методу Laravel , потім надсилаємо їх до template, а потім нарешті створюємо нормаль html tableз даними, переглядаючи їх усі. Наприклад, ми відображаємо uri e.g /home, name e.g home_routeви призначили та інші.
Gideon Maina

Працює для Laravel 5.6.x Дякую
Вікі Гілл,

4

якщо ви скомпілювали маршрути, такі як / login / {id}, і вам потрібен лише префікс:

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

4

Кращий спосіб зробити його читабельним - це зареєструвати маршрут і роздрукувати його у веб-браузері з безпосереднім висновком майстра

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

1
Краще змініть останній рядок Закриття на return '<pre>' . \Artisan::output() . '</pre>';для кращого форматування.
parrker9

Будь-яка ідея, як це відфільтрувати? Наприклад, для маршрутів, які починаються такapi/
utdev

@utdev Я знаю, що це старі коментарі, ти можеш передати параметр для фільтрації таким чином\Artisan::call('route:list', ['--path' => 'api']);
Meow Kim

2

Код

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;
}

Ремісник

Laravel 4

php artisan routes

Laravel 5

php artisan route:list

2
$routeList = Route::getRoutes();

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

use Illuminate\Support\Facades\Route;

На Laravel 5.4 це працює, 100%


1

Покращення відповіді @ jeanfrg

Він має кілька застарілих функцій. Він відображає помилку під час редагування відповіді, отже, розміщуючи її тут.

Laravel 6, 7 і 8

Покладіть всередину 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>";
});

Демо: доступ до нього через<url>/routes

Вихідна демонстрація



0

Для Laravel 5.4. * Цей код чудово працює.

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>";
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.