Laravel 8.x で Target class [Class Name] does not exist. エラーが発生した場合の対処法


はじめに

Laravel8.x系で下記のようにルーティング設定したところエラーが発生しました。

Route::get('/auth/login', 'AuthController@getAuth');
Illuminate\Contracts\Container\BindingResolutionException
Target class [AuthController] does not exist.
http://localhost:8000/auth/login

今までLaravel 6.x系をやっていたので、8.x系ではRoutingの仕様が大幅に変更されたようです。

Laravel doc

上記サイトによれば、以前までのバージョンではRouteServiceProvidierクラスにはApp\Http\Controllersのnamespace プロパティが含まれていたようです。しかし、Laavel 8以降からはこのプロパティの値が「null」となっているようです。

実際にみてみると「RouteServiceProvider」クラスでは下記処理がコメントアウトされていました。

/**
 * The controller namespace for the application.
 *
 * When present, controller route declarations will automatically be prefixed with this namespace.
 *
 * @var string|null
 */
// protected $namespace = 'App\\Http\\Controllers';

今まで通り利用したい場合は、このコメントを外せば、以前のバージョン通りにルーティングができます。

では以下で実際に対処方法について記載します。

対処方法

まずは上述したように「ROuteServiceProvider」クラスの$namespace部分のコメントを解除します。

/**
 * The controller namespace for the application.
 *
 * When present, controller route declarations will automatically be prefixed with this namespace.
 *
 * @var string|null
 */
protected $namespace = 'App\\Http\\Controllers';

上記実施後に今まで通りのルーティングを設定してみると普通に動作しました。

もう一つは、ルーティングパスにフルパスを指定します。

Route::get('/auth/login', 'App\Http\Controllers\AuthController@getAuth');

これでも問題なく動作します。

最後に

フレームワークのメジャーバージョンアップは結構仕様が変更されるので、注意してアップデートする必要があります。