컨트롤러란
라우트 파일에 모든 요청 처리 로직을 클로저로 정의하는 대신, “컨트롤러” 클래스를 사용해 이 동작을 정리할 수 있습니다. 컨트롤러는 관련된 요청 처리 로직을 하나의 클래스로 모을 수 있습니다. 예를 들어UserController 클래스는 사용자의 표시·생성·갱신·삭제 등 사용자에 관한 모든 수신 요청을 처리할 수 있습니다.
기본적으로 컨트롤러는 app/Http/Controllers 디렉터리에 저장됩니다.
컨트롤러 생성
새 컨트롤러를 빠르게 생성하려면make:controller Artisan 명령을 사용합니다.
애플리케이션의 모든 컨트롤러는 기본적으로 app/Http/Controllers 디렉터리에 저장됩니다.
기본 컨트롤러
컨트롤러 클래스는 수신하는 HTTP 요청에 응답하는 여러 public 메서드를 가질 수 있습니다.App\Http\Controllers\UserController 클래스의 show 메서드가 호출되고, 라우트 파라미터가 메서드로 전달됩니다.
컨트롤러는 베이스 클래스를 상속할 필요는 없습니다. 다만 모든 컨트롤러에서 공유해야 할 메서드를 가진 베이스 컨트롤러 클래스를 상속하면 편리한 경우가 있습니다.
싱글 액션 컨트롤러
컨트롤러의 액션이 특히 복잡한 경우, 컨트롤러 클래스 전체를 그 단일 액션에 전념시키면 편리합니다. 이를 실현하려면 컨트롤러 안에 단일__invoke 메서드를 정의합니다.
make:controller Artisan 명령의 --invokable 옵션을 사용해 호출 가능한 컨트롤러를 생성할 수 있습니다.
리소스 컨트롤러
애플리케이션 내의 각 Eloquent 모델을 “리소스”라고 생각하면, 각 리소스에 대해 동일한 조작 세트(CRUD)를 실행하는 것이 일반적입니다. Laravel의 리소스 라우팅은 전형적인 생성·읽기·갱신·삭제(CRUD) 라우트를 한 줄의 코드로 컨트롤러에 할당합니다.make:controller Artisan 명령의 --resource 옵션을 사용해 이 액션들을 처리하는 컨트롤러를 빠르게 생성할 수 있습니다.
app/Http/Controllers/PhotoController.php에 컨트롤러를 생성합니다.
컨트롤러에는 사용 가능한 각 리소스 조작의 메서드가 스텁으로 포함됩니다.
다음으로 컨트롤러를 가리키는 리소스 라우트를 등록합니다.
php artisan route:list 명령을 실행하면 애플리케이션 라우트의 개요를 빠르게 확인할 수 있습니다.부분적 리소스 라우트
리소스 라우트를 선언할 때 컨트롤러가 처리해야 할 액션의 서브셋을 지정할 수 있습니다.API 리소스 라우트
API에서 사용하는 리소스 라우트를 선언하는 경우,create나 edit 같이 HTML 템플릿을 표시하는 라우트를 제외하고 싶은 경우가 많습니다.
apiResource 메서드를 사용하면 이 두 라우트를 자동으로 제외할 수 있습니다.
의존성 주입
생성자 주입
Laravel의 서비스 컨테이너는 모든 Laravel 컨트롤러의 의존 해결에 사용됩니다. 따라서 컨트롤러의 생성자에 컨트롤러가 필요로 하는 의존을 타입 힌트로 지정할 수 있습니다. 선언된 의존은 자동으로 해결되어 컨트롤러 인스턴스에 주입됩니다.메서드 주입
생성자 주입에 더해 컨트롤러의 메서드의 의존도 타입 힌트로 지정할 수 있습니다. 메서드 주입의 일반적인 유스케이스는Illuminate\Http\Request 인스턴스를 컨트롤러 메서드에 주입하는 것입니다.
Illuminate\Http\Request를 타입 힌트하면서 id 파라미터에도 접근할 수 있습니다.
다음 단계
라우팅
라우트 정의 방법과 컨트롤러와의 연동을 되짚어 봅니다.