LoginSignup
3
2

More than 1 year has passed since last update.

【Laravel】Controllerメソッドの戻り値が意図した値で返却されない

Last updated at Posted at 2022-09-09

環境

  • 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 メソッドで対象のレコードの数を取得したい。

api.php
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']);
});
ReservationController.php
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 コマンドで確認するも、ルーティングは設定されている模様。
スクリーンショット 2022-09-08 16.24.11.png

キャッシュクリア、オートロード

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.php
    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']);
    });
    

    【変更後】

    api.php
    Route::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']);
    });
    
  • 数字が返却された
    スクリーンショット 2022-09-09 12.14.54.png

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2