본 포스팅에서는 Laravel 프레임 워크를 8 버전으로 작업했을 때 발생한 문제점을 기록합니다.
Laravel 8 버전에서만 발생하는 문제점으로 보이며, web.php에서 정의하는 Route 객체에서 Controller 네임스페이스를 찾지 못하는 현상이 발견되었습니다.
이전 버전에서는 컨트롤러의 네임 스페이스 접두사를 자동으로 지정해 주어서 사용자는 컨트롤러를 작성하는 것 외에는 신경 쓸 것이 없었지만, 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의 라우트를 정의할 수 있습니다.
'Dev > PHP' 카테고리의 다른 글
[PHP] Ubuntu - Laravel 프로젝트 Heroku에서 MySQL 사용하기 (0) | 2020.10.10 |
---|---|
[PHP] Ubuntu - Laravel 프로젝트 Heroku에 배포하기(DB 없음) (0) | 2020.10.09 |
[PHP] Laravel - smtp를 이용한 메일 전송 구현 (0) | 2020.09.19 |
[PHP] Arch Linux에서의 LEMP 스택 + Laravel 개발 환경 설치 매뉴얼 (0) | 2020.09.16 |
[PHP] Laravel에서의 MVC 패턴 구현 (6) | 2020.03.03 |