【问题标题】:Get routes of a specific path via Route::getRoutes() laravel method通过 Route::getRoutes() laravel 方法获取特定路径的路由
【发布时间】:2016-07-26 16:50:19
【问题描述】:

问题很明显。

我们知道使用Route::getRoutes() 方法可以像这样获取 laravel 项目中所有定义的路由:

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

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

return array_unique($arr);

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

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

我该怎么做?

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    这是一个使用 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 方法轻松实现,但由于这是一个对象数组,并且您想要只能通过对 getPath 的方法调用访问的 path 字符串,那么集合的reduce 方法可以用作解决方法。

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


    您可以在Laravel Documentation 中阅读有关集合的更多信息。

    【讨论】:

    • 我将 laravel 升级到 5.5,现在出现错误:Method getPath does not exist.。似乎它被删除了。有什么替代品吗?
    • 替换为uri()
    【解决方案2】:

    我会选择正则表达式:

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

    【讨论】:

      【解决方案3】:

      你可以使用this apporach:

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

      【讨论】:

      • getRoutes() 方法返回一个RoutesCollection 实例,与普通的Collection 不同,它没有任何where 方法,所以这不起作用。请修改您的答案。
      • 现在我会知道的,谢谢。我想在这种情况下,最好的方法就是使用简单的循环来过滤路由。我已经更新了我的答案。
      猜你喜欢
      • 2019-02-10
      • 1970-01-01
      • 1970-01-01
      • 2021-03-28
      • 2014-05-24
      • 1970-01-01
      • 2020-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多