🦔

Laravel 名前付きルートのちょっとした発見

2023/04/28に公開2

はじめに

それなりに古いバージョンから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を見てみたところ...

https://github.com/laravel/docs/commit/40328f1c695228cc0a4244bd946592a631e19d77

特にプルリクエストがあるわけでも、cleaning up routing docsとコメントが書かれたコミットだけなのでドキュメントから消えた理由はわからず...

一応、5.1でnameメソッドの書き方が登場した時はプルリクエストはありましたね。
https://github.com/laravel/docs/pull/1845

ならlaravel/frameworkを見るしかない

nameメソッドが追加された経緯をみつければ、なぜasが消えたのかわかるかもしれない
ってことでlaravel/frameworkを見ていくと...

https://github.com/laravel/framework/pull/5859

5.0で一度追加しようとしたプルリクエストを見つけました。
コメントを見る限り、賛成意見が多いし、プルリクエストの作成者も連想配列より、メソッドの方が優れているとアピールしていますね。
しかし、この時は配列でもいいじゃないかってことでTaylor氏がクローズしていますね。

つぎに5.2で再び入れようとしています。
https://github.com/laravel/framework/pull/10200

こちらはTaylor氏から5.1でよろしく的な感じのコメントを残してクローズしています。

なので、最終的に5.1で追加されたって流れですかね。
https://github.com/laravel/framework/pull/10210

ではasは使えなくなったのか

試しに、手元にあったLaravel10.9.0のバージョンを使ってasで名前を付けたルートを用意して動かしてみました。

routes/web.php
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はまだまだ現役で活躍している感じがしますね。
https://github.com/laravel/framework/blob/v10.9.0/src/Illuminate/Routing/Route.php#L875-L880

まとめ

nameメソッドが追加された経緯は判明しましたが、asがドキュメントから消えた理由は特に判明しなかったです。
一応、ドキュメントに書いていないだけで、asを使ってルートに名前を付けることは可能なのはわかりましたが、ドキュメントから消えているので、いつかは使えなくなる可能性はあると思います。
なので、nameメソッドを使った方がいいんでしょうね。

Discussion

nshironshiro

新しい方式が誕生すると、Laravel チーム的にはそちらが推奨になりますので、古いやり方はドキュメントからは消えてしまう、とそんな感じかなと思います😊

なおなお

そのような流れがあるんですね
だから、ドキュメントにはメソッドを使うほうが書かれているわけですか