通过 Route::getRoutes() laravel 方法获取特定路径的路由
Posted
技术标签:
【中文标题】通过 Route::getRoutes() laravel 方法获取特定路径的路由【英文标题】:Get routes of a specific path via Route::getRoutes() laravel method 【发布时间】: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()
,但对我不起作用。
我该怎么做?
【问题讨论】:
【参考方案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
方法,所以这不起作用。请修改您的答案。
现在我会知道的,谢谢。我想在这种情况下,最好的方法就是使用简单的循环来过滤路由。我已经更新了我的答案。以上是关于通过 Route::getRoutes() laravel 方法获取特定路径的路由的主要内容,如果未能解决你的问题,请参考以下文章
PHP PHPBBForumlarındaKullanıcılarıŞifresiniTopluHa
c_cpp Üçbasamaklırakamlarıbirbirindenfarklıtümsayılarıekrandagösterenvebu kurala
c_cpp Kullanıcıdan1000sidıgirmesiisteniyor。 Girilensayılariçerisindebusayılarınortalamasındanda