🐈

web.phpのルート名は必要で、api.phpのルート名はいらない(Laravel×Vue.js)

2021/03/19に公開

今回はタイトルにあるように、ルーティングのルート名の指定について解説したいと思います。

※私はよくLaravel×Vue.jsでAPI開発を行っているのですが、もしかしたら表題の件が当てはまらない場合もあるかもしれませんので、きちんと理由を理解した上で判断してください!

では、さっそくいってみましょう!

web.phpに書くルートにはルート名が合ったほうが良い

こちらに関しては今回は本題ではないのであまり解説しません。web.phpにルート名を入れるのが良いということは結構知られていることかなと思います。

Route::get('/user', 'UserController@index')->name('user.index');

例えばこのように、ユーザーを全取得するルーティングには user.index みたいに自分で名前をつけてあげます。

すると、基本blade上で user.index という風にルート名を指定していれば、URLを変えたいときにweb.phpを修正するだけで済みます(ルート名は変わらないので)

などなど、まあいろいろ利点はあるのですが、
こちらに詳しく書かれていましたので、ルート名を使ったことが無い方はぜひ読んでみてください

Laravel使うならrouteには名前をつけたほうが良い

api.phpに書くルートにはルート名がない方が良い

livewireはまだ勉強できていないので、livewireをお使いの方は参考にしないでください。

私はLaravel×Vue.jsで開発することが多いのですが、
api.phpにルート名を書かないほうが良い事に気づきました。

Laravel×Vue.jsでAPIを用いた開発では、api.phpのルート名を使える箇所はありません。私はもともとFeature Testの際に、ルート名を指定してAPIリクエストを送っていましたが、これは NG行為 でした。

今日はその話がメインになります。

Feature Testでルート名を指定してはいけない理由

理由はただ1つです。

Vue.jsからAPIリクエストを送る際に、ルート名を使用しないですよね?

これに尽きます。

ルート名のメリットの1つに「URLを変更してもルート名を変えなければ、API呼び出し箇所を修正する必要がない」というのがありました。

しかし、Vue.jsからAPIを呼び出すときに、ルート名を指定することはできません。

なのにテストでAPIルート名を呼び出しているとどういうことが起こるでしょうか?

それはURLを変更した際にテストで気づけないということです。


例えばこのような APIのルートがあるとします。

Route::post('/user', 'UserController@create')->name('api.user.create');

Vue.jsでは、 /user にPOSTリクエストを送ると指定します。

Feature Testでは、 route('api.user.create') にリクエストを送ると指定します。


URLを変更すると、

Route::post('/user/create', 'UserController@create')->name('api.user.create');

Vue.jsではURL変更をするのを忘れており依然として /user にPOSTリクエストを送ると指定されています。

この状態でテストを実行した場合、

Feature Testでは、 route('api.user.create') にリクエストを送っているので、URLが変更されてもエラーは発生しませんが、 Vue,jsでは /user にリクエストを送っているので「そんなURL無いよ!」ってエラーが発生してしまいます。

終わりに

実際どのくらいの人が API開発でルート名をつけているのか分かりませんが、
自分が体験した失敗を他の方がしないように参考にしていただければ良いと思います。

はじめにでも書きましたが、もしかしたら当てはまらない場合もあるかもしれませんので、きちんと理由を理解した上で判断していただければと思います。

Discussion