1
0

More than 1 year has passed since last update.

Laravel で ルーティングしたら Invalid route action: [<ActionClassName>]. で怒られた

Last updated at Posted at 2022-10-19

エラー時の状況

Laravel で ADR の設計で REST API の開発をしているとき、Action を routes/api.php にルーティングを設定したら怒られたので備忘録。

UnexpectedValueException

Invalid route action: [App\Http\Actions\Todo\GetAction].

`App\Http\Actions\Todo\GetAction` was not found.
Controller class `App\Http\Actions\Todo\GetAction` for one of your routes was not found. Are you sure this controller exists and is imported correctly?

エラーログの内容を要約すると以下の通りです。

  • Action が無効だよ
  • App\Http\Actions\Todo\GetAction は存在しないよ、ちゃんとインポートしている?

環境

  • PHP 8.1.11
  • Laravel 9.36.0

エラーの原因の仮説

エラーログをもとに仮説を立ててみる。

  • インポートする namespace のパスが間違っている
  • インポートするモジュール名が間違っている。

エラーが関係していそうなファイルをチェックしてみる。

routes/api.php
<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Actions\Todo\GetAction;

Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
    return $request->user();
});

Route::get('/todo', GetAction::class);
app/Actions/Todo/GetAction.php
<?php

declare(strict_types=1);

namespace App\Http\Actions\Todo;

use App\Http\Controllers\Controller;
use Todo\Repository\TodoRepository as Repository;
use Doctrine\ORM\EntityManagerInterface as EntityManager;

class GetAction extends Controller
{
    // 省略
}

うん、routes/api.php で参照している namespace もモジュール名も間違っていなさそう…

いや、まて…
よくみると、モジュールのディレクトリと namespace が相違しているような。

  • ディレクトリ -> app/Actions/Todo
  • namespace -> App\Http\Actions\Todo

Http ディレクトリ配下に Actions を配置すればエラーは解消されるのでは?

仮説を検証してみる

早速、移動してみることに。

  • before: app/Actions/Todo/GetAction.php
  • after: app/Http/Actions/Todo/GetAction.php

すると、エラーが解消されました!

原因

namespace とディレクトリの場所が不一致だったことが原因でした。
namespace は任意に設定していいものだと勝手に思っていましたが、ディレクトリとイコールじゃないとモジュールを参照できないようです。

これで 3 時間ぐらいとけました。
まぁ、勉強になったし、勘違いも解けなので OK でしょう!

🎉🎉🎉

1
0
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
1
0