Laravel 名前付きルートのちょっとした発見
はじめに
それなりに古いバージョンからLaravelを使っていると
ルートに名前を付ける時は、配列にasというキーで指定していたりしました。
// asを使った書き方
Route::get('user/profile', ['as' => 'profile', function () {
//
}]);
気が付けば、nameメソッドを使うように変わっていました。
// nameメソッドを使った書き方
Route::get('/user/profile', function () {
// ...
})->name('profile');
一体どこでnameメソッドが増えたのか、なぜasが消えていったのか、ちょっと調べてみました。
まずはドキュメントから見ていく
古いやつだと4.2からあるので順番に見ていきます。
4.2のドキュメント
asを使った書き方が載っています。
さすがにまだnameメソッドはなさそうです。
5.0のドキュメント
4.2と変化がない感じです。
配列の書き方がarray()から[]になったのでサポートしているPHPバージョンに変化があった感じなんでしょうね。
5.1のドキュメント
お、ここでnameメソッドが登場しましたね
Route::get('user/profile', 'UserController@showProfile')->name('profile');
ただ、asの書き方も載っている状態ですね。
5.2のドキュメント
文章に変化はありますが、5.1とサンプルコードに変化はなしですね。
5.3のドキュメント
お、ここでasを使った書き方が消えて、nameメソッドに変わりましたね。
つぎにlaravel/docsを見てみる
ドキュメントを見る限り、5.3で何かがあってasが消えたと思うのでlaravel/docsを見てみたところ、
とくにプルリクエストがあるわけでも、cleaning up routing docsとコメントが書かれたコミットだけなのでドキュメントから消えた理由はわからずでした。
一応、5.1でnameメソッドの書き方が登場した時はプルリクエストはありましたね。
ならlaravel/frameworkを見るしかない
nameメソッドが追加された経緯をみつければ、なぜasが消えたのかわかるかもしれないってことでlaravel/frameworkを見ていくことにした。
5.0で一度追加しようとしたプルリクエストを見つけました。
コメントを見る限り、賛成意見が多いし、プルリクエストの作成者も連想配列より、メソッドの方が優れているとアピールしていますね。
しかし、この時は配列でもいいじゃないかってことでTaylor氏がクローズしていますね。
つぎに5.2で再び入れようとしています。
こちらはTaylor氏から5.1でよろしく的な感じのコメントを残してクローズしています。
なので、最終的に5.1で追加されたって流れですかね。
ではasは使えなくなったのか
試しに、手元にあったLaravel10.9.0のバージョンを使ってasで名前を付けたルートを用意して動かしてみました。
Route::get('/welcome', ['as' => 'welcome', function () {
return view('welcome');
}]);
routeへルパ関数を使ってurlが取れたのでLaravel10.9.0でも使えることは確認できました。
$ php artisan -V
Laravel Framework 10.9.0
$ php artisan tinker
Psy Shell v0.11.16 (PHP 8.2.3 — cli) by Justin Hileman
> route('welcome');
= "http://localhost/welcome"
実際nameメソッドの処理を見てみると、裏ではasはまだまだ現役で活躍している感じがしますね。
まとめ
nameメソッドが追加された経緯は判明しましたが、asがドキュメントから消えた理由は判明しませんでした。
一応、ドキュメントに書いていないだけでasを使ってルートに名前を付けることは可能であることがわかりましたが、ドキュメントから消えているので、いつかは使えなくなる可能性があります。
そのため、nameメソッドを使った方が良いでしょう。
Discussion
新しい方式が誕生すると、Laravel チーム的にはそちらが推奨になりますので、古いやり方はドキュメントからは消えてしまう、とそんな感じかなと思います😊
そのような流れがあるんですね
だから、ドキュメントにはメソッドを使うほうが書かれているわけですか