시작하기

애플리케이션의 요청에 대한 모든 처리 로직을 하나의 routes.php 파일에 정의하는 것 보다 별도의 컨트롤러 클래스를 통해서 구성할 수도 있습니다. 컨트롤러는 클래스를 구성하여 HTTP 요청에 대한 그룹을 지정합니다. 컨트롤러는 app/Http/Controllers 디렉토리에 저장 됩니다.

컨트롤러 정의

아래는 기본 컨트롤러 클래스의 예입니다. 컨트롤러는 Laravel에 포함 된 기본 컨트롤러 클래스들을 확장합니다. 기본 클래스는 미들웨어를 컨트롤러 액션에 연결하는 데 사용할 수 있는 middleware메소드와 같은 몇 가지 편리한 메소드를 제공합니다.

<?php

namespace App\\Http\\Controllers;

use App\\Http\\Controllers\\Controller;
use App\\Models\\User;

class UserController extends Controller
{
    /**
     * Show the profile for the given user.
     *
     * @param  int  $id
     * @return View
     */
    public function show($id)
    {
        return view('user.profile', ['user' => User::findOrFail($id)]);
    }
}

여러분은 다음과 같이 컨트롤러의 액션에 라우트를 지정할 수 있습니다.

use App\\Http\\Controllers\\UserController;

Route::get('user/{id}', [UserController::class, 'show']);

이제 사용자의 요청이 지정된 라우트의 URI와 일치할 때 UserController 클래스의 show 메소드가 실행될것입니다. 이때, 라우트의 파라미터들 또한 메소드에 전달될 것입니다.

{tip} 컨트롤러는 기본 클래스를 확장하기 위해 필수가 아닙니다. 그러나 middleware, validate, dispatch 함수와 같은 편리한 기능을 사용할 수는 없습니다.

단일 동작 컨트롤러

단일 액션만을 처리하는 컨트롤러를 정의하고 싶다면 컨트롤러에 하나의 __invoke 메소드를 넣을 수 있습니다.

<?php

namespace App\\Http\\Controllers;

use App\\Http\\Controllers\\Controller;
use App\\Models\\User;

class ShowProfile extends Controller
{
    /**
     * Show the profile for the given user.
     *
     * @param  int  $id
     * @return View
     */
    public function __invoke($id)
    {
        return view('user.profile', ['user' => User::findOrFail($id)]);
    }
}

단일 액션 컨트롤러에 대한 경로를 등록 할 때 함수를 지정할 필요가 없습니다.

use App\\Http\\Controllers\\ShowProfile;

Route::get('user/{id}', ShowProfile::class);

Artisan 커맨드 make:controller 에 --invokable 옵션을 사용하여 호출 가능한 컨트롤러를 생성 할 수 있습니다.