通过Route :: getRoutes()laravel方法获取特定路径的路由

时间:2016-04-06 10:33:53

标签: php laravel

问题很明显。

我们知道使用Route::getRoutes()方法可以在laravel项目中获得所有已定义的路由,如下所示:

$routeCollection = Route::getRoutes();
$arr    =   [];

foreach ($routeCollection as $value) {
    $arr[] =    $value->getPath();
}

return array_unique($arr);

但我希望在特定路径中获取所有已定义的路由,例如/admin

我认为可以将路径名称传递给getRoutes(),但这对我不起作用。

我该怎么做?

3 个答案:

答案 0 :(得分:3)

这是一个利用Laravel集合的解决方案:

$routes = collect(Route::getRoutes()->getRoutes())->reduce(function ($carry = [], $route) {
    !starts_with($route->getPath(), 'admin') ?: $carry[] = $route->getPath();

    return  $carry;
});

所以现在routes数组将返回以admin开头的路径路径列表。这是在那里发生的事情:

  • 使用Route::getRoutes()将返回RoutesCollection,其中有getRoutes方法,该方法返回Illuminate\Routing\Route个实例的平面数组。然后,您可以将其传递给collect方法,该方法将返回所有这些路线的Collection

  • 现在您只需删除不以admin开头的值。如果这是一个简单的值数组,可以使用filter方法轻松实现,但由于这是一个对象数组,并且您希望path字符串只能通过对{的方法调用来访问{1}},可以使用集合的reduce方法作为变通方法。

此外,您会注意到条件会检查路径是以getPath开头,而不是admin。这是因为Laravel路由器在构建路径集合时会自动删除前导斜杠。

您可以在Laravel Documentation中了解有关馆藏的更多信息。

答案 1 :(得分:1)

您可以使用this apporach

$routeCollection = Route::getRoutes();
$adminRoutes = [];

foreach ($routeCollection as $value) {
    strpos($value->getPath(), 'admin') === false ?: $adminRoutes[] = $value->getPath();
}

答案 2 :(得分:1)

我会选择正则表达式:

    $routeCollection = Route::getRoutes();
    $arr             = [];

    foreach ($routeCollection as $value) {
        if (preg_match('/^\/?admin/', $value->getPath())) {
            $arr[] = $value->getPath();
        }
    }
    $filteredRoutes = array_unique($arr);