Laravel 8での“Target class controller does not exist”エラーの対処法

はじめに

Laravel 8を使用して開発を行っている際、Api\RegisterControllerというクラスが存在しないというエラーに遭遇することがあります。このエラーの背景と対処法について解説します。

エラーの背景

Laravel 8では、以前のバージョンと異なり、RouteServiceProvider$namespaceプロパティが設定されていません。これは、Laravel 8.xでデフォルトでnullとなっており、Laravelによる自動の名前空間のプレフィックスが適用されないことを意味します。したがって、ルートでコントローラーを参照する際には、完全修飾クラス名を使用する必要があります。

例:

use App\Http\Controllers\UserController;

Route::get('/users', [UserController::class, 'index']);
// または
Route::get('/users', 'App\Http\Controllers\UserController@index');

旧バージョンの方法を好む方へ

もし、Laravelの旧バージョンのような動作を好む場合、App\Providers\RouteServiceProviderの以下の部分を編集することで実現できます。

public function boot()
{
    ...

    Route::prefix('api')
        ->middleware('api')
        ->namespace('App\Http\Controllers') // こちらを追加
        ->group(base_path('routes/api.php'));

    ...
}

しかし、この方法だけでは十分ではありません。実際には、RouteServiceProvider内の$namespaceプロパティを適切に設定して、名前空間のプレフィックスを適用することが必要です。

ソリューション

Laravel 8のバージョン8.0.2以降で新しくインストールされた場合、RouteServiceProvider内のprotected $namespaceをアンコメントすることで、旧バージョンの方法に戻ることが可能です。

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

この変更により、コントローラーに名前空間のプレフィックスが自動的に追加されます。

さいごに

Laravel 8の新しい動作は初めてのユーザーやアップグレードを考慮しているユーザーにとっては戸惑うかもしれません。しかし、理解と適切な設定を行うことで、問題を簡単に解決することができます。この記事が、エラーの解決に役立つことを願っています。

参考

Error “Target class controller does not exist” when using Laravel 8

タイトルとURLをコピーしました