【Laravel】Target class [xxxController] does not exist: Laravelのエラー解決方法

Laravel-Route-Error

こんにちはフロントエンドエンジニアのまさにょんです!

今回は、Laravelで、Target class [xxxController] does not exist: のエラーが発生したときに解決する方法について解説していきます。

Target class [xxxController] does not exist: のエラーはなぜ起こる?

実は、この「Target class [xxxController] does not exist: 」エラーは、Laravel のバージョン8以降で発生するものになります。

Laravel のバージョン8以降から、RouteServiceProvider.php ファイルの設定が変わった影響で、

web.phpでルーティングを使おうとしても、上記のエラーが発生します。

エラー解決の方法は、いくつかあるのですが、今までのルーティングの記述方法をそのまま使用するための方法と、

新しい記述の方法によるエラー解決の2つの方法を紹介します。

エラー解決方法-1: RouteServiceProviderのファイルを最適化する

Laravel のバージョン8以降から、RouteServiceProvider.php ファイルの設定が変わったので、

そのファイルの設定を最適化することで、エラーを解決することができます。

Laravel 8系なら、1ヶ所のコメントアウトを解除する

Laravel 8系なら、RouteServiceProvider.php ファイルの次のコメントアウトを解除すれば、エラーは解決します。

FilePath(相対Path)は [ /app/Providers/RouteServiceProvider.php ] になります。

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

Laravel 9系なら、2ヶ所にコードを追加する必要がある

FilePath(相対Path)は [ /app/Providers/RouteServiceProvider.php ] になります。

<?php

namespace App\Providers;

use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Facades\Route;

// FilePath: [ /app/Providers/RouteServiceProvider.php ]

class RouteServiceProvider extends ServiceProvider
{
    /**
     * The path to the "home" route for your application.
     *
     * Typically, users are redirected here after authentication.
     *
     * @var string
     */
    public const HOME = '/home';

    // 追加!!
    protected $namespace = 'App\\Http\\Controllers';

    /**
     * Define your route model bindings, pattern filters, and other route configuration.
     *
     * @return void
     */
    public function boot()
    {
        $this->configureRateLimiting();

        $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'));
        });
    }

    /**
     * Configure the rate limiters for the application.
     *
     * @return void
     */
    protected function configureRateLimiting()
    {
        RateLimiter::for('api', function (Request $request) {
            return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
        });
    }
}

エラー解決方法-2: 新しい書き方でルート設定を記載する

新しいルート設定の書き方に変更することで、エラーを解決することもできます。

作成したコントローラーを追加する

web.php または api.php のどちらか、ルーティングの設定をするファイルに、作成したコントローラーを use文で追加します。

// 1. 作成したコントローラーを追加する!
use App\Http\Controllers\RobotamaController;

ルーティングを新しい書き方で設定する

use文を追加したら、ルーティングを新しい書き方で設定します。

// 以前のルーティングの記述方法
// Route::get('/robotama', 'RobotamaController@robotama_price_list');

// 新しいルーティングの記述方法
Route::get('/robotama', [ RobotamaController::class, 'robotama_price_list' ]);

Twitterやってます!Follow Me!

神聖グンマー帝国の逆襲🔥

神聖グンマー帝国の科学は、世界一ぃぃぃぃぃぃ!!!!!

プログラミング学習・エンジニア転職関連の情報

自宅で現役エンジニアから学べる『TechAcademy』 (エンジニア転職保証)

『GEEK JOBキャンプ』スピード転職コース(無料)

【IT道場】入校時0円! 就職目的プログラミングスクール

エンジニア転職なら100%「自社開発」求人に強い【クラウドリンク】

『techgym』 (Python特化・無料)

PHP / Laravel書籍

参考・引用

  1. Target class Controller does not exist:Laravelのルート設定エラー対策

最近の投稿