컨트롤러에 메소드가 추가될 때마다 routes.php 파일에 등록하는 것은 매우 번거로운 일입니다. 라라벨은 컨트롤러를 등록해 놓고 해당 URL 로 오는 모든 요청을 처리할 수 있는 방법을 제공합니다.

 

암시적 컨트롤러를 테스트하기 위해 artisan 에서 ImplicitController 를 만들어 봅시다.

$ php artisan make:controller ImplicitController
CODE

라라벨 5.1 사용자는 --plain 옵션을 추가해야 합니다.

 

이제  Route::controller 메소드를 사용하여 라우팅과 컨트롤러를 지정합니다.

Route::controller('impl', 'ImplicitController');
CODE

 

메소드 이름 규칙

이제 컨트롤러의 메소드 이름은 HTTP 메소드(get, post, put, delete 등) 와 처리할 액션으로 구성하면 됩니다.

예로 impl/index 를 GET 방식으로 호출할 경우 메소드 이름은 getIndex 가 되며 POST 방식으로 impl/profile 를 호출할 경우 postProfile 이 호출됩니다.

impl/foo-bar-baz 처럼 URL 에 - 가 있는 경우는 getFooBar 처럼  StudlyCase 케이스로 메소드 이름을 만들면 됩니다.

 /** GET impl/index */
    public function getIndex()
    {
        return 'getIndex';
    }
     
    /** GET impl/show/3 */
    public function getShow($id)
    {
        return 'getShow : ' . $id;
    }
     
    /** POST impl/profile */
    public function postProfile()
    {
        return 'postProfile';
    }
     
    /** GET impl/foo-bar */
    public function getFooBar()
    {
        return 'getFooBar';
    }
CODE

이제 브라우저로  http://homestead.app/impl/show/3 에 연결하면 getShow 메소드가 호출되는 것을 확인할 수 있습니다.

tinker 로 URI 변환

이름 변환 규칙은 헷갈리므로 php artisan tinker 명령어로 REPL 을 띄운 후에 직접 메소드 이름에서 URI 로, URI 에서 메소드 이름으로 변환할 수 있습니다.

URI 에서 메소드 이름으로 변환하는 경우 URL 을 studly_case() 헬퍼 함수로 변환한 후에 HTTP 메소드 이름을 붙여 주면 됩니다.

예로 URL 이 /foo-bar-baz 이고 HTTP PUT 메소드를 처리하는 컨트롤러의 메소드 명은 다음과 같이 putFooBarBaz 가 됩니다.

>>> 'put' . studly_case('foo-bar-baz')
=> "putFooBarBaz"
CODE

 

컨트롤러 메소드 명에서 URI  로 변환하는 규칙은 약간 더 복잡합니다. putFooBarBaz 를 예로 들면 HTTP 메소드인 put 을 뺀 나머지 FooBarBaz 를 snake_case() 로 변환한 후에 _ 를 - 로 변환하기 위해 str_slug() 를 호출해 주어야 합니다.

>>> str_slug (snake_case('FooBarBaz')) 
=> "foo-bar-baz"
CODE

 

암시적 컨트롤러는 라우트에 일일이 등록하지 않아도 되는 장점이 있지만 전체 애플리케이션의 라우팅 구성이 가려지고 메소드가 일관성이 없어질 수 있다는 단점이 있으므로 권장하지 않는 의견도 있습니다.

 

이런 문제를 해결하기 위해 라라벨이 제공하는 리소스 컨트롤러에 대해서 알아 보겠습니다.