エラー時の状況
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 でしょう!
🎉🎉🎉