PHP
laravel
laravel5
laravel5.6

Laravel5.6 で URL からコントローラのアクションを逆引きする

やりたいこと

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\ を削ったりとか。

このコードではルーティングパラメータに対応してないが、それも頑張ればできそう。