问题是显而易见的。
我们知道 withRoute::getRoutes()方法可以获取 laravel 项目中所有定义的路由,如下所示:
$routeCollection = Route::getRoutes();
$arr = [];
foreach ($routeCollection as $value) {
$arr[] = $value->getPath();
}
return array_unique($arr);
Run Code Online (Sandbox Code Playgroud)
但我想获取特定路径中的所有定义的路由,例如/admin。
我认为可以传递路径名来getRoutes()执行此操作,但对我不起作用。
我怎样才能做到这一点 ?
这是一个利用 Laravel 集合的解决方案:
$routes = collect(Route::getRoutes()->getRoutes())->reduce(function ($carry = [], $route) {
!starts_with($route->getPath(), 'admin') ?: $carry[] = $route->getPath();
return $carry;
});
Run Code Online (Sandbox Code Playgroud)
所以现在routes数组将返回以 开头的路由路径列表admin。这是那里发生的事情:
使用Route::getRoutes()将返回一个RoutesCollection,它有自己的getRoutes方法,该方法返回实例的平面数组Illuminate\Routing\Route。然后,您可以将其传递给collect将返回Collection所有这些路由的方法。
现在您只需删除不以 开头的值admin。如果这是一个简单的值数组,可以使用该filter方法轻松实现,但由于这是一个对象数组,并且您希望path只能通过方法调用访问该字符串getPath,因此可以使用集合的reduce方法作为解决方法。
另外,您会注意到条件检查路径是否以admin和 开头/admin。这是因为 Laravel 路由器在构建路由集合时会自动去除前导斜杠。
您可以在Laravel 文档中阅读有关集合的更多信息。