본문 바로가기

Dev/PHP

[PHP] Laravel - Target class [] does not exist. 문제 해결

 

 

본 포스팅에서는 Laravel 프레임 워크를 8 버전으로 작업했을 때 발생한 문제점을 기록합니다.

Laravel 8 버전에서만 발생하는 문제점으로 보이며, web.php에서 정의하는 Route 객체에서 Controller 네임스페이스를 찾지 못하는 현상이 발견되었습니다.

 

 

Laravel Framework 8.5.0

이전 버전에서는 컨트롤러의 네임 스페이스 접두사를 자동으로 지정해 주어서 사용자는 컨트롤러를 작성하는 것 외에는 신경 쓸 것이 없었지만, Laravel 8 버전부터는 자동으로 지정해주지 않아서 생기는 문제입니다.

 

참고로 이전 버전에서 정의하는 Route 정의의 예시는 아래와 같습니다.

 

Route::get('/home','MainController@home');

 

이를 해결하기 위한 솔루션은 2가지입니다.

 

1. web.php에서 컨트롤러 전체 경로를 넣어준다.

Route::get('/home','App\Http\Controllers\MainController@home');

// 혹은 use 키워드로 사용

use App\Http\Controllers\MainController;

Route::get('/home',[MainController::class, 'home']);

 

2. RouteServiceProvider.php에 컨트롤러 네임스페이스를 지정해준다.

아마 이전 버전부터 Laravel을 사용해 오신 분들은 예전 스타일대로 개발하는 것을 선호할 수 있습니다.

그럴 경우 이 방식대로 하면 과거의 스타일대로 라우트를 작성할 수 있습니다.

app/Providers/RouteServiceProvider.php 파일을 열고 $namespace 변수를 찾습니다.

 

 

사진을 보면 $namespace 값이 null로 지정되어 있습니다.

본 포스팅에서 다루는 문제점의 원인이 바로 이 변수입니다.

해당 변수의 값을 다음과 같이 지정합니다.

 

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

 

그리고 하단의 boot 함수에서  this->routes로 시작하는 함수를 다음과 같이 변경합니다.

 

// 수정 전
$this->routes(function(){
	Route::middleware('web')
        ->group(base_path('routes/web.php'));
    Route::prefix('api')
        ->middleware('api')
        ->group(base_path('routes/api.php'));
});


// 수정 후
$this->routes(function(){
	Route::middleware('web')
        ->namespace($this->namespace)
        ->group(base_path('routes/web.php'));
    Route::prefix('api')
        ->middleware('api')
        ->namespace($this->namespace)
        ->group(base_path('routes/api.php'));
});

 

위 방식 들로 Laravel 8의 라우트를 정의할 수 있습니다.