问题很明显。
我们知道使用Route::getRoutes()
方法可以在laravel项目中获得所有已定义的路由,如下所示:
$routeCollection = Route::getRoutes();
$arr = [];
foreach ($routeCollection as $value) {
$arr[] = $value->getPath();
}
return array_unique($arr);
但我希望在特定路径中获取所有已定义的路由,例如/admin
。
我认为可以将路径名称传递给getRoutes()
,但这对我不起作用。
我该怎么做?
答案 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);