Page tree

app/Http/routes.php 파일을 수정하여 지금 생성한 컨트롤러를 라우트에 등록할 순서로 Route::resource 메소드를 사용하여 RESTful 리소스 컨트롤러로 등록하면 됩니다.

컨트롤러 등록

앞으로 모든 컨트롤러는 web 미들웨어 그룹 밑에 등록하는 것을 기본으로 하며 특별히 기술하지 않을 것입니다.

Route::group(['middleware' => 'web'], function () {
	// 프로젝트 등록
	Route::resource('project', 'ProjectController');

1부에서 학습한 REF: 레스트풀 리소스 컨트롤러 로 돌아가서 위와 같이 사용할 경우 어떻게 라우팅이 되는지 다시 한 번 기억을 더듬어 보고 다음 명령어로 등록한 라우팅 목록을 확인해 봅시다.

$ php artisan route:list

특정 라우팅 경로나 이름만 출력할 경우 --path 또는 --name 옵션을 사용하면 되며 다음은 경로가 project 인 라우팅 목록만 출력합니다.

$ php artisan route:list --path=project 

route:list 결과

RESTful 이므로 POST /project 를 실행하면 store() 메소드가 실행되어 새로운 프로젝트를 생성하며 DELETE /project/3 을 실행하면 id 가 3 번인 프로젝트가 삭제하도록 구현하면 됩니다.

 

인증 미들웨어 연결

기능을 사용하려면 로그인을 해야 하므로 ProjectController 는 인증 기능을 가져야 하며 예전 PHP 방식으로 개발한다면 인증이 필요한  메소드마다 시작전에 인증 여부를 확인하는 코드를 넣어주면 됩니다.

class ProjectController extends Controller
{
	// 프로젝트 생성성
    public function store(Request $request)
    {
        if (!Auth::check()) {
            abort(403, '로그인이 필요합니다.');
        }

하지만 위와 같은 코드를 메소드마다 넣어주는 것은 라라벨답지 않으며 이에 대한 해결책은 바로 REF: 미들웨어 입니다.

미들웨어는 애플리케이션보다 먼저 호출되므로 ProjectController::create() 메소드 실행전에 인증 여부를 체크하는 auth 미들웨어를 설정하면 컨트롤러 수정없이 인증 여부를 검사할 수 있습니다.

 

가장 쉬운 방법은 미들웨어 그룹을 정의하고 auth 미들웨어를 설정하고 라우팅을 이 그룹 밑에 두는 입니다.

Route::group(['middleware' => 'auth'], function()
{
    Route::resource('project', 'ProjectController');
});

또는 컨트롤러의 생성자에서 middleware() 메소드를 통해서 특정 미들웨어를 등록할 수 있으므로 명시적으로 auth 미들웨어를 등록해 주면 됩니다.

class ProjectController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
    }

각각의 장단점이 있겠지만 첫 번째 것의  컨트롤러의 생성자에 미들웨어를 지정하지 않아도 되는 장점이 있으므로 여러 개의 컨트롤러가 공통 미들웨어를 사용할 경우 유용합니다.

 

이제 해당 미들웨어가 제대로 등록되었는지 확인해 보기 위해 다음 명령을 다시 실행해 봅시다.

$ php artisan route:list --path=project

 

route:list 의 출력 결과중 마지막 컬럼이 미들웨어를 표시하며 제대로 등록되었음을 확인할 수 있습니다.

auth 미들웨어 확인

 

중첩 리소스(Nested Resources)

이제 Task 컨트롤러에 대한 라우팅을 추가할 차례로 모든 Task 는 Project 에 포함되어 있으므로 3번 프로젝트에 속한 task 를 보는 REST 요청은 GET /project/3/task/show 와 같이 기술되는게 관례입니다.

 

라라벨은 구분자인 점(.)을 통해 라우팅에 간단하게 중첩된 리소스를 기술할 수 있으며 자식 컨트롤러는 부모.자식 형식으로 기술하면 됩니다. 독자들도 아래의 코드를 보며 라우팅 경로를 머릿속으로 그려 본후에 artisan route:list 명령어로 확인해 봅시다.

 

Route::group(['middleware' => 'auth'], function()
{
    Route::resource('project', 'ProjectController');
    Route::resource('project.task', 'ProjectTaskController');
});

 

 

이제 컨트롤러와 라우팅 등록을 마쳤으니 실제 프로젝트와 할일 관리 기능을 구현해 봅시다.