1
0

php artisan route:list 実行後→Class "PostController" does not exist

Posted at

開発環境

  • Mac OS Monterey(バージョン12..2.1)
  • MacBook Air (M1)
  • composer version 2.0.9
  • Laravel Framework 10.10

Todoアプリのバックエンド側を実装中、Laravelでルーティングの設定をしており、ルートの確認をしようと以下を実行

php artisan route:list

すると…

Class "PostController" does not exist

とエラー表示が!!!

PostControllerが存在しないと怒られている…が、PostControllerはあるんだけどな〜となりました。

色々調べていると、どうやらver7→ver8で、この辺のルーティングの設定方法が異なっているっぽいことが判明。

いくつかのサイトを参考にしたので、追記しておきます。

試したこと

今回試したこととしては、以下になります。

  • RouteServiceProvier.phpで名前空間を追記
  • アクション構文の使用
  • オートローダーの実行

RouteServiceProvider.phpで名前空間を追記


こんな感じで、/homeの下に、protected $namespace = 'App\Http\Controllers'; を追加。

public const HOME = '/home';

protected $namespace = 'App\Http\Controllers';

このタイミングで、以下の部分にも追記を行った。

public function boot(): void
    {
        RateLimiter::for('api', function (Request $request) {
            return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
        });

        $this->routes(function () {
            Route::middleware('api')
                ->prefix('api')
                ->group(base_path('routes/api.php'));

            Route::middleware('web')
                ->namespace($this->namespace)//←追記
                ->group(base_path('routes/web.php'));
        });

コマンドを実行するも、変化なし。

アクション構文の使用


こちらは、既にやっていたもののとりあえず、再度確認。

//todo作成
Route::get('/todo', [PostController::class, 'create']);
//todo一覧表示
Route::post('/posts', [PostController::class, 'index']);
//todo削除
Route::delete('/todoDelete', [PostController::class, 'todoDelete']);

オートローダーの実行


オートローダーがPHPクラスを見つけることができず、エラーが発生しているのではないかと思いこちらを実行。

composer dump-autoload -o

こちらも変化なし。

※オートローダーとは

→ファイルを自動で読み込む仕組みのこと。これがあると、requireをしなくても名前空間を指定するだけで、クラスを使用できる。

特に解決法が見つからないまま、画像検索をしていたらあることに気づいた。

「namespaceの部分1つしか追記してないな〜」

というのも、api.phpは特に設定したりしていなかったので、特別気にしていなかった。

ということで、改めて、apiの方にも追記。

public function boot(): void
    {
        RateLimiter::for('api', function (Request $request) {
            return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
        });

        $this->routes(function () {
            Route::middleware('api')
                ->namespace($this->namespace)//←追記
                ->prefix('api')
                ->group(base_path('routes/api.php'));

            Route::middleware('web')
                ->namespace($this->namespace)//←追記
                ->group(base_path('routes/web.php'));
        });
    }

これでコマンドを実行すると…

routeList.gif

表示できた!!!

色んなサイト渡り歩きましたが、上記3つをするとほぼ解決するみたいです。

僕みたいに、見落としてる可能性もあると思うので、同じ実装になってるかはちゃんと確認をした方が良さそうですね(自戒)

参考

1
0
1

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