애플리케이션의 요청에 대한 모든 처리 로직을 하나의 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 옵션을 사용하여 호출 가능한 컨트롤러를 생성 할 수 있습니다.