🛤️

Laravel route:list に地味に追加された並び替えオプションを試してみた

2021/06/29に公開

2022年10月 追記

Laravel Ver.9.1.0 で、半分勘違いもあってか、下記で紹介している --sort=precedence オプションは消されてしまいました。
それ以降は、代わりに --sort=domain がいいかも知れません。
なお、--compact オプションも今はありません。

本文

小ネタですが、Laravel 8.48.2 にて route:list コマンドで、定義したルート順に表示する事ができるようになったので、試してみました。

参考:GitHub Add "resolution" order to route:list command #37824

ちなみに、何も並び順を指定しない時というのは、URI 順なんですね。
まぁ、それは悪くはないかも知れませんが、定義した順に表示させたいという事はあると思います。

そこで、出てきたのが、--sort=precedence オプションです。今までも、method やら action やらで並び替えはできましたが、何故か定義した順は無かった訳ですね。

例えば、web.php に以下のように記述がある時、

Route::get('/zzz', [PhotoController::class, 'zzz']);
Route::get('/hoge', [PhotoController::class, 'hoge']);
Route::get('/bar', [PhotoController::class, 'bar']);
php artisan route:list --compact

とコマンド叩けば、

+----------+----------+-------------------------------------------+
| Method   | URI      | Action                                    |
+----------+----------+-------------------------------------------+
| GET|HEAD | bar      | App\Http\Controllers\PhotoController@bar  |
| GET|HEAD | hoge     | App\Http\Controllers\PhotoController@hoge |
| GET|HEAD | zzz      | App\Http\Controllers\PhotoController@zzz  |
+----------+----------+-------------------------------------------+

と表示されていましたが、

php artisan route:list --compact --sort=precedence

と叩けば、

+----------+----------+-------------------------------------------+
| Method   | URI      | Action                                    |
+----------+----------+-------------------------------------------+
| GET|HEAD | zzz      | App\Http\Controllers\PhotoController@zzz  |
| GET|HEAD | hoge     | App\Http\Controllers\PhotoController@hoge |
| GET|HEAD | bar      | App\Http\Controllers\PhotoController@bar  |
+----------+----------+-------------------------------------------+

と表示される訳ですね。
あまりいい例ではなかったかも知れませんが、多くの定義がある時に、不用意にURIで並び替えられると、逆に「どこだ?」と探してしまうかも知れませんね。

もっとも、本当に多い時はフィルタとかして、

php artisan route:list --compact --sort=precedence --path=hoge

+----------+------+-------------------------------------------+
| Method   | URI  | Action                                    |
+----------+------+-------------------------------------------+
| GET|HEAD | hoge | App\Http\Controllers\PhotoController@hoge |
+----------+------+-------------------------------------------+

とした方がいいのかも知れませんが。

余談ですが

個人的には、歓迎なオプションですが、日本人の私的には、もうちょっと短くて簡単な綴りの方が嬉しかったぞ、と思う所はあります。
まぁ、この際、しっかり precedence(優先、先に来ること、先行、優位) の綴りを覚えるしか無いですね。もし忘れた時は、

php artisan route:list --help

Options:
      --sort[=SORT] The column (precedence, domain, method, uri, name, action, middleware) to sort by [default: "uri"]
(他、略)

で確認できます。

ちなみに、元のPRでは、"resolution" (先にルートが解決された順)でしたが、
Taylor氏によって、"precedence" に置き換えられました。先に定義されたものが先(早い者勝ち)とでも覚えておきます。

Discussion