TL;DR
該当のControllerをuse
し、::class
でそのクラスの完全修飾名を取得。それをControllerとして指定する。
use App\Http\Controllers\HogeController; Route::get('/hoge', [HogeController::class, 'hogeAction']);
起こるエラー
Illuminate\Contracts\Container\BindingResolutionExceptionTarget class [コントローラーの名前] does not exist.
問題のコードと前提
HogeController.phpはapp/Http/Controllers
に間違いなく配置されている。Route::get
で指定しているクラス名もtypoしていない。
Route::get('/hoge', 'HogeController@hogeAction');
対処
Laravel8系において、Controllerはクラスの完全修飾名で指定する。
use App\Http\Controllers\HogeController; // HogeController::class の実行結果は // 'App\Http\Controllers\HogeController' Route::get('/hoge', [HogeController::class, 'hogeAction']);
以下でも同じ動作をしますが、Controllerのクラス名::class
を使用する上記の方法の方が可読性が良さそうです。(公式ドキュメントのサンプルコードもControllerのクラス名::class
の形)
Route::get('/hoge', 'App\Http\Controllers\HogeController@hogeAction');
参考
Laravel 8.x 公式ドキュメント Routing#The Default Route Files
https://laravel.com/docs/8.x/routing#the-default-route-files