今回はroutingに関しての問題です。
CRUDのAPIを作成しているときにどれだけリクエストを出してもエラーが出てきたので解決します。
Table of Contents
エラー概要
前提条件
- Laravel8
- CRUDのAPIは作成済み
エラーの内容
api.php
は以下のように書きました。(実際はちょっと違うけど意味は同じ)
Route::get('user', [UserController::class, 'index'])->name('user.index');
Route::get('user/{user-id}', [UserController::class, 'show'])->name('user.show');
Code language: PHP (php)
ほんで、index(ユーザー一覧取得)に関してはレスポンスとしてちゃんと成功が返ってきていたんよね。↓みたいな感じで。
{
"success": true,
"messsage": "Get All Success!",
"details": [
{
"id": 1,
"name": "demo",
"email": "dummy@example.com",
"deleted_at": null,
"created_at": null,
"updated_at": null,
}
]
}
Code language: JSON / JSON with Comments (json)
けど、showメソッドを利用したときには以下のエラーが出てきたんですよ。
{
"success": false,
"summary": "HTTP ERROR!!",
"details": ""
}
Code language: JSON / JSON with Comments (json)
うおおなんでい!
これ、そもそもControllerまでたどり着いてないなあっていうことまでわかったんです~
ということで解決策考えていきましょう。
伝えたいこと
api.phpの書き方。(route parameterの規則について際確認)
しっかり公式から情報を取得してコードを書くことを再度行って欲しい!プログラムは思ったようには動かないので、ルールに沿って書くようにしましょう。
解決方法
結論から言えば、問題はroute parameterの書き方にありました。
公式からの情報は以下です。
Route parameters are always encased within
https://laravel.com/docs/8.x/routing#route-parameters{}
braces and should consist of alphabetic characters. Underscores (_
) are also acceptable within route parameter names. Route parameters are injected into route callbacks / controllers based on their order – the names of the route callback / controller arguments do not matter.
特に確認してほしいのはUnderscores (_) are also acceptable within route parameter names
の部分です!
そう、
route parameter名の中に書いてよいのは
アンダースコアでハイフンは利用できないんです!
僕が書いていたのは以下のようなハイフンで区切ったものでした。
Route::get('user/{user-id}', [UserController::class, 'show'])->name('user.show');
Code language: PHP (php)
これじゃあだめで、以下のように、アンダースコアで区切るようにするべきだったんです!
Route::get('user/{user_id}', [UserController::class, 'show'])->name('user.show');
Code language: PHP (php)
user-id
からuser_id
に修正しました!
ということで解決!
まとめ
初心者の心を忘れるべからず。ルールに沿ってちゃんと書く。
デバッグは一つ一つ分解していき、どこまではエラーが出ないのかを見つける。そうすることで解決に近づく。