Laravel Controller

Laravel Controller 의 역할은 라우트로 들어온 Closure의 로직을 처리하는 역할을 합니다. 연관된 요청 처리 로직별로 묶어서 하나의 Single Controller Class로 만들어 사용합니다. Laravel 의 Controller 들은 app/Http/Controllers 디렉토리 아래 정의되어 있습니다.
여기서 생각해볼만한 점은 내 라라벨 어플리케이션은 비즈니스 로직을 어디에 두고 사용할 것인가? 입니다. Controller, Model 에 비즈니스 로직을 처리할 수 도 있으며 Service 또는 Repository 같은 레이아웃 계층을 추가하여 사용할 수 도 있습니다. 책임을 어디에 부여할것인가? 생산성은 어느 정도 나올 것인가? 어플리케이션 사이즈를 고려하여 자유롭게 사용하시면 됩니다.
1. Basic Usage
기본적은 Controller 사용법에 대해 익혀 보겠습니다. 생성이 간편한 Artisan 을 사용하여 Controller를 만들어 보겠습니다.
php artisan make:controller ProfileController
app/Http/Controllers 디렉토리 아래 ProfileController가 생성됩니다. 생성된 컨트롤러를 보면 Controller 라는 클래스를 상속 구현하고 있습니다. 이 Controller 를 구현하는 경우 validate, middleware, dispatch 같은 메소드를 사용하기 편하게 합니다.
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class ProfileController extends Controller { public function index() { return view('profile'); } }
생성된 Controller에 메소드를 작성하고 Route에 아래 처럼 작성하여 사용합니다. RouteServiceProvider 에 루트 디렉토리로 app/Http/Controllers가 등록되어 있으므로 Route 디렉토리 아래 파일에선 namespace 생략이 가능합니다.
// Controller @ Method 형태의 문자열로 사용한다. // RouteServiceProvider에 $namespace로 app/Http/Controllers 루트 디렉토리로 등록되어있다. Route::get('/', 'ProfileController@index');
2. Controller Middleware
Controller 에서 미들웨어를 사용하고 싶은 경우에는 두 가지로 사용할 수 있습니다.
2-1. Route 파일에서 미들웨어 사용
Route::get('/', 'HomeController@index')->middleware('middlewareName');
2-2. Controller 생성자에서 미들웨어 사용
Controller 생성자에서도 미들웨어를 사용할 수 있습니다. Controller 를 상속 구현 하고 있기때문에 middleware 에 쉽게 접근이 가능합니다. 일반적인 미들웨어는 라우트 단계에서 그룹화해서 사용하는 것이 효과적이지만 특정한 미들웨어를 특정한 컨트롤러에 사용해야하는 경우에는 다음과 같이 생성자에 등록하고 사용합니다.
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class ProfileController extends Controller { public function __construct() { $this->middleware('profileAuth'); $this->middleware('specificMiddleware'); } }
3. Resource Controller

라라벨은 Resource 중심의 REST 아키텍쳐 어플리케이션을 구현을 편리하게 해줍니다. ( REST 한계를 느끼고 GraphqL 등 대체할 방안들이 등장하고 있는 시점이지만 아직 REST 를 선호하는 개발자가 많습니다. ) Resource 중심의 컨트롤러를 Artisan 을 이용해 생성해보겠습니다.
php artisan make:controller BuildingController --resource
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class BuildingController extends Controller { public function index() { // } public function create() { // } public function store(Request $request) { // } public function show($id) { // } public function edit($id) { // } public function update(Request $request, $id) { // } public function destroy($id) { // } }
위의 소스 코드처럼 REST 아키텍쳐 CRUD에 맞는 메소드를 미리 정의해줍니다. 이제 라우트에 Resource 메소드를 사용하여 해당 메소드들을 매칭시킵니다.
Route::resource('buildings', 'BuildingController');
4. Controller Dependecy Injection
라라벨 Service Container는 컨트롤러에 Type-Hinting을 이용한 Resolving으로 의존성 주입을 수행합니다. 컨트롤러는 생성자와 메소드에서 의존성 주입을 받을 수 있습니다.
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Repositories\ProfileRepository; class ProfileController extends Controller { // 생성자를 통한 Injection public function __construct(ProfileRepository $repository) { } // 메소드를 통한 Injection // url => /profiles/{id} public function show(Request $request, $id) { } }
TL;DR
- 라라벨에서 Controller 는 route의 Closure 부분을 담당한다.
- app/Http/Controller 를 구현함으로써 middleware, validate 등 기능을 쉽게 사용 가능하다.
- REST 아키텍쳐 구현이 쉽도록 Resource Controller 기능을 제공한다.
- Laravel 컨트롤러는 Type Hinting 를 통해 생성자와 메소드에서 의존성 주입을 받는다.