Laravelでページを表示したときに、以下エラーが出た場合の対処法。
Illuminate\Contracts\Container\BindingResolutionException
Target class [ContactController] does not exist.
http://127.0.0.1:8001/contact
ルーティングで指定されたコントローラが存在しない。というエラー。
▼ルーティング例
web.php
Route::get('contact', 'ContactController@index');
コントローラ名を省略表記してる場合に発生する。
##対処法
1. コントローラ名があっているか確認
2. RouteServiceProvider.phpのコメントアウトを解除する
3. 完全な名前空間を記載する
ファイル名(名前空間)が正しい場合は、No2を実行すれば解決する可能性が高い。
No.3でやっていることはNo.2と同じ。
##RouteServiceProvider.phpのコメントアウトを解除する Laravel7までは、`App\Http\Controllers\`が省略できたが、Laravel8からは省略するとエラーが表示されるようになった。
以下ファイルのコメントアウトを解除することで、Laravel7と同じ環境にできる。
app > Providers > RouteServiceProvider.php
解除するコメントアウト
//protected $namespace = 'App\\Http\\Controllers';
RouteServiceProvider.php
protected $namespace = 'App\\Http\\Controllers'; //コメントアウトを解除
/**
* Define your route model bindings, pattern filters, etc.
*
* @return void
*/
public function boot()
{
$this->configureRateLimiting();
$this->routes(function () {
Route::prefix('api')
->middleware('api')
->namespace($this->namespace)
->group(base_path('routes/api.php'));
Route::middleware('web')
->namespace($this->namespace)
->group(base_path('routes/web.php'));
});
}
##完全な名前空間を記載する Laravel8のデフォルト状態でも、完全な名前空間を指定すれば問題なく機能する。
▼ルーティング例
web.php
Route::get('contact', 'ContactController@index');
↓修正
web.php
Route::get('contact', 'App\Http\Controllers\ContactController@index');
##まとめ コメントアウト解除が超簡単なのでおすすめ。