如何筛选Laravel中指向视图的GET路由URI?
如何筛选Laravel中关联视图的GET路由?
我需要给URI命名以便在分析面板展示(每个关联视图的URI都有实际名称,还要做多语言翻译)。目前我已经通过以下步骤提取所有GET路由的URI:
- 执行命令导出GET路由为JSON文件:
php artisan route:list --method=GET --json - 通过PHP代码读取并提取URI:
$uris_json = file_get_contents("/path/to/routes/file"); $uris_array = json_decode($uris_json, true); $uris = array_column($uris_array, 'uri');
现在我能查看所有GET URI并手动命名,但部分GET路由并不关联视图,需要逐一排查,请问有没有方法可以直接筛选出最终指向视图的GET路由?
方法1:利用路由JSON的action字段筛选
Laravel导出的路由JSON中,action字段会存储路由对应的闭包或控制器方法信息,可通过分析该字段快速定位关联视图的路由:
筛选闭包型视图路由
如果路由是直接通过闭包返回视图(比如Route::get('/', fn() => view('home'))),直接过滤action包含view(的条目即可:
$uris_json = file_get_contents("/path/to/routes/file"); $uris_array = json_decode($uris_json, true); $view_routes = array_filter($uris_array, function($route) { return str_contains($route['action'], 'view('); }); $view_uris = array_column($view_routes, 'uri');
筛选控制器型视图路由
对于指向控制器方法的路由,需要扫描控制器文件,判断方法内是否调用了view():
$controller_routes = array_filter($uris_array, function($route) { return str_contains($route['action'], '@'); }); $view_uris = []; foreach ($controller_routes as $route) { list($controller, $method) = explode('@', $route['action']); $controller_path = app_path("Http/Controllers/{$controller}.php"); if (!file_exists($controller_path)) continue; $content = file_get_contents($controller_path); // 匹配方法内是否存在view()调用 if (preg_match("/public function {$method}\(.*\).*view\(/s", $content)) { $view_uris[] = $route['uri']; } }
方法2:给视图路由添加自定义标识
在定义路由时,给关联视图的路由添加专属属性,后续可直接通过属性筛选:
// 方式1:利用路由命名(适合已有命名规范的场景) Route::get('/dashboard', [DashboardController::class, 'index'])->name('web.dashboard'); // 方式2:添加自定义属性 Route::get('/profile', [ProfileController::class, 'show'])->middleware('web')->setOption('has_view', true);
导出路由时可直接过滤:
# 筛选带有web前缀命名的路由 php artisan route:list --method=GET --json --name=web.
方法3:用Artisan命令的--filter参数快速过滤
如果你的控制器有明确的目录区分(比如Web视图控制器放在App\Http\Controllers\Web下,API控制器放在Api下),直接用命令行过滤:
php artisan route:list --method=GET --json --filter=Web\\
内容的提问来源于stack exchange,提问作者pileup
相关产品推荐
相关产品推荐

