環境
- Macbook Air 2020
- Laravel 9.27.0
- PHP 8.0.23
- sail v1.15.4
- Composer 2.4.1
1.状況
LaravelにてAPIを構築しておりGETメソッドでエンドポイント /reservation/status/{gym_id}/{machine_id}
にアクセスすると、 ResrvationController.php
内の getReservationStatus
メソッドで対象のレコードの数を取得したい。
Route::prefix('reservation')->group(function () {
Route::get('/{reservation_id}/{gym_id}/{machine_id}', [ReservationController::class, 'nextReservationExists']);
Route::get('/status/{gym_id}/{machine_id}', [ReservationController::class, 'getReservationStatus']);
});
public function getReservationStatus($gym_id, $machine_id)
{
$count = Reservation::where([
["gym_id", "=", $gym_id],
["machine_id", "=", $machine_id],
["start_at", "=", null],
["is_canceled", "=", 0],
])->count();
return $count;
}
2.エラー内容
エラーは特に出ていなかったが、数字が返却されず json
が常に返却される。
{
"id": 1,
"gym_id": 2,
"machine_id": 8,
"user_id": 3,
"is_canceled": 0,
"start_at": null,
"end_at": null,
"created_at": "2022-09-07T05:13:27.000000Z",
"updated_at": "2022-09-07T07:36:44.000000Z"
}
3.調査
ルーティングの設定を確認
sail artisan route:list
コマンドで確認するも、ルーティングは設定されている模様。
キャッシュクリア、オートロード
sail composer dump-autoload
sail artisan route:clear
sail artisan config:clear
を実行したが変化なし。
/status
を /test
に変更
特に変化なし。 json
が返却される
実行されたメソッド名取得して返却してみる
ResrvationController.php
のGETメソッド内に return __FUNCTION__
を記述し意図した関数が実行されているか確認。
↓↓↓
原因判明
4.原因
-
getReservationStatus
メソッドを呼び出しているつもりが、エンドポイント/reservation/{reservation_id}/{gym_id}/{machine_id}
のnextReservationExists
メソッドが呼び出されていた - エンドポイント①
/reservation/status/{gym_id}/{machine_id}
とエンドポイント②/reservation/{reservation_id}/{gym_id}/{machine_id}
の階層が同じで、 ①にアクセスした場合でもstatus
が{reservation_id}
のところに入ってしまい②にアクセスしている状態になっていた
5.解決策
-
ルーティングファイルの
/reservation/status/{gym_id}/{machine_id}
と/reservation/{reservation_id}/{gym_id}/{machine_id}
の記述を逆にした【変更前】
api.phpRoute::prefix('reservation')->group(function () { Route::get('/{reservation_id}/{gym_id}/{machine_id}', [ReservationController::class, 'nextReservationExists']); Route::get('/status/{gym_id}/{machine_id}', [ReservationController::class, 'getReservationStatus']); });
【変更後】
api.phpRoute::prefix('reservation')->group(function () { Route::get('/status/{gym_id}/{machine_id}', [ReservationController::class, 'getReservationStatus']); Route::get('/{reservation_id}/{gym_id}/{machine_id}', [ReservationController::class, 'nextReservationExists']); });