본문 바로가기
Computer/PHP

Laravel에서 Contoller Class를 찾지 못할 때...

by MC02 2021. 10. 15.

오랜만에 새로운 프로젝트를 Laravel 8로 개발 시작.

 

테스트 코드를 먼저 작성하는 개발을 한번 해보려 했으나...

시작부터 당황하게 만들어준다.

라우트에 다음과 같은 경로를 추가 해주고 테스트를 실행

Route::get('/', 'BaseController@index')->name('site-index');

그랬더니....

Expected response status code [200] but received 500.

The following exception occurred during the request:

ReflectionException: Class "BaseController" does not exist in ...

컨트롤러를 찾을 수 없다고?
Laravel 양반 이게 무슨 소리요...

이전에 Laravel 5.x 쓸때는 잘 되었단 말이오...



그래서 잠시 구글링을 해 보니, 외국 형님들이 서로 주거니 받거니 정리를 잘 해 두셨더라. (링크)

 

1. 컨트롤러 클래스 네임 앞에, 네임스페이스 전체 경로를 포함 한다.

Route::get('/', 'App\Http\Controllers\BaseController@index')->name('site-index');

2. 해당 클래스를 use 키워드를 사용한다.

use App\Http\Controllers\BaseController;

Route::get('/main', [BaseController::class, 'index'])->name('site-index');

3. (이게 가장 편리 한 방법) RouteServiceProvider에 controller들의 네임스페이스를 설정 해 준다.
(컨트롤러 네임스페이스가 기본적으로 설정은 되어 있었으나 주석처리 되어 있었다.)

// app\Providers\R
protected $namespace = 'App\\Http\\Controllers';

3번 방법의 경우 7.x 최신버전까지는 기본 적용 되어 있었고

v8.0.0에서는 $namespace 변수 제거.

v8.0.1에서 $namespace = null로 되돌아옴.

v8.0.2부터 지금과 같은, 기본값 셋팅+주석처리가 되어 있음.

 

 

IDE에서 코드 추적 등을 고려 해보면 2번 방법에 익숙해지는것이 좋을것 같다.

댓글