やりたいこと
routes/web.php
Route::get('hoge', 'HogeController@index');
Route::get('fuga', 'FugaController@index');
みたいになっているときに https://xxx.com/hoge
という情報から HogeController@index
を得たい。
確認環境
- Laravel 5.6
- PHP 7.1
コード
Route::getRoutes()
でiterable なルーティング一覧 Illuminate\Routing\RouteCollection
を返してくれるようなので、それを使う。
function uriToAction($uri, $method = 'GET')
{
$route = collect(Route::getRoutes())
->where('uri', $uri)
->filter(function ($route) use ($method) {
return in_array(strtoupper($method), $route->methods);
})
->first();
return $route->action['uses'] ?? null;
}
実行結果
>>> uriToAction('hoge');
=> "App\Http\Controllers\HogeController@index"
あとはお好みで parse_url()
などを使ってフルの URL から解決できるようにしたり、App\Http\Controllers\
を削ったりとか。
このコードではルーティングパラメータに対応してないが、それも頑張ればできそう。