はじめに
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の仕様が大幅に変更されたようです。
上記サイトによれば、以前までのバージョンでは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');
これでも問題なく動作します。
最後に
フレームワークのメジャーバージョンアップは結構仕様が変更されるので、注意してアップデートする必要があります。