일반적으로 URL 문자열과 해당 컨트롤러 클래스/메소드 사이에는 일대일 관계가 있습니다. URI의 세그먼트는 일반적으로 이 패턴을 따릅니다.

example.com/class/method/id/

그러나 경우에 따라 URL에 해당하는 클래스 대신 다른 클래스/메소드를 호출할 수 있도록 이 관계를 다시 맵핑해야 할 경우가 있습니다.

예를 들어 URL에 이런 프로토타입이 있어야 한다고 가정해 보겠습니다.

example.com/product/1/
example.com/product/2/
example.com/product/3/
example.com/product/4/
    

일반적으로 URL의 두 번째 세그먼트는 메소드 이름으로 예약되어 있지만 위의 예제에서는 대신 제품 ID가 있습니다. 이를 위해 CodeIgniter는 URI 처리기(handler)를 다시 매핑할 수 있습니다.

자신만의 라우팅 규칙 설정

라우팅 규칙(rule)은 `app/Config/Routes.php` 파일에 정의되어 있습니다. 여기에서 고유한 라우팅 기준을 지정할 수 있는 RouteCollection 클래스의 인스턴스가 생성됩니다. 자리 표시자(placeholder) 또는 정규식(Regular Expressions)을 사용하여 경로를 지정할 수 있습니다.

라우터는 왼쪽의 URI를 가져와 컨트롤러에 전달해야 하는 매개 변수를 오른쪽의 컨트롤러/메소드에 맵핑합니다. 컨트롤러와 메소드는 완전한 이름 공간 클래스(fully-namespaced class)와 Users::list와 같이 이중 콜론(정적 메소드를 사용하는 것과 동일한 방식)으로 분리하여 나열합니다.

해당 메소드에 매개 변수를 전달해야 한다면 메소드 이름 뒤에 슬래시로 구분하여 나열합니다.

// Calls the $Users->list()
Users::list
// Calls $Users->list(1, 23)
Users::list/1/23
    

Examples

다음은 기본적인 몇 가지 라우팅 예입니다.

자리 표시자(Placeholder)

일반적으로 경로(route)는 다음과 같습니다

$routes->add('product/(:num)', 'App\Catalog::productLookup');

경로에서 첫 번째 매개 변수는 일치할 URI이고, 두 번째 매개 변수는 다시 라우팅해야 하는 대상입니다. 위의 예제는 URL의 첫 번째 세그먼트가 “product”이고 두 번째 세그먼트에 숫자가 있으면 “AppCatalog” 클래스의 “productLookup” 메소드로 라우팅됩니다.

자리 표시자는 단순히 정규식 패턴을 나타내는 문자열입니다. 라우팅 프로세스가 진행되는 동안 이러한 자리 표시자는 정규식 값으로 대체됩니다. 이들은 주로 가독성을 위해 사용됩니다.

경로에서 사용할 수있는 자리 표시자는 다음과 같습니다.

Placeholders Description
(:any) 해당 시점부터 URI 끝까지의 모든 문자와 일치하며, 여기에는 여러 URI 세그먼트가 포함될 수 있습니다.
(:segment) 결과를 단일 세그먼트로 제한하는 슬래시(/)를 제외한 모든 문자와 일치합니다.
(:num) 모든 정수와 일치합니다.
(:alpha) 모든 알파벳 문자와 일치합니다
(:alphanum) 영문자, 정수 문자열, 둘의 조합과 일치합니다.
(:hash) (:segment)와 같습니다. 그러나 hashded id를 사용합니다. (모델 문서 참조).

사용자정의 자리 표시자

가독성을 위해 경로(route) 파일에 사용자 정의 자리 표시자를 만들어 사용할 수 있습니다.

정규식

원하는 경우 정규식을 사용하여 라우팅 규칙을 정의할 수 있습니다. 역 참조와 마찬가지로 유효한 정규식이 허용됩니다.

정규 표현식에 대해 더 배우고 싶은 사람들에게 regular-expressions.info가 좋은 출발점이 될 수 있습니다.

클로저(Closure)

경로가 매핑되는 대상으로 익명 함수(anonymous function) 또는 클로저를 사용할 수 있습니다. 이 기능은 사용자가 해당 URI를 방문할 때 실행됩니다. 작은 작업을 빠르게 실행하거나 간단히 뷰만 표시하는 데 편리합니다.

다중 경로 매핑

한 번에 여러 경로에 대해 매핑하려면 add() 메소드보다 map() 메소드를 사용하는것이 편리합니다. 추가해야 할 각 경로에 대해 add() 메소드를 여러번 호출하는 대신 배열로 경로(route)를 정의한 다음 이를 map() 메소드에 매개 변수로 전달할 수 있습니다.

라우트 리디렉션

서비스를 오래 동안 유지한 사이트는 페이지가 이동되기 마련입니다. 라우트의 addRedirect() 메소드를 사용하면 이전 경로를 다른 경로로 리디렉션(redirect)할 수 있습니다. 첫 번째 매개 변수는 이전 경로의 URI 패턴입니다. 두 번째 매개 변수는 리디렉션할 새 URI 또는 명명된 경로(route)명입니다. 세 번째 매개 변수는 리디렉션과 함께 전송되어야 하는 HTTP 상태 코드입니다. 기본값은 임시 리디렉션을 뜻하는 302이며 대부분의 경우 권장됩니다

페이지 로드중 요청(request) 경로가 리디렉션 경로와 일치하면 컨트롤러를 로드하기 전에 사용자는 새 페이지로 리디렉션됩니다.

라우트 그룹화

`group()` 메소드를 사용하여 경로를 그룹화 할 수 있습니다. 그룹 이름은 그룹 내부에 정의된 경로 앞에 나타나는 세그먼트가 됩니다. 이렇게 하면 관리자 영역을 구축할 때와 같이 시작 문자열을 공유하는 광범위한 경로 작성에 필요한 입력(typing)을 줄일 수 있습니다.

다음 예제는 ‘users’와 ‘blog’ URI를 접두사 “admin”을 사용하여 `/admin/users`와 `/admin/blog`로 만들어 줍니다.

그룹에 옵션을 할당할 수 있습니다. 다음 예는 `namespace`를 옵션으로 지정하였으며, URI `/api/users`를 사용하여 `App\Controllers\Routing\API\v1` 컨트롤러에 대한 리소스 경로(route)를 처리합니다.

라우트 그룹에 특정 필터(filter)를 사용할 수 있습니다. 필터를 사용하면 컨트롤러 호출 전후에 필터를 실행하며, 인증이나 api 로깅에 유용합니다.

필터 값은 app/Config/Filters.php에 정의된 별칭(aliase)중 하나와 일치해야 합니다. 다음 예는 'csrf' 필터를 적용한 예입니다.

필요한 경우 그룹 내에 그룹을 중첩하여 보다 세밀한 구성을 할 수 있습니다.

다음은 URL `admin/users/lists`를 라우팅한 예입니다. 외부 group()에 전달된 옵션(예: namespace와 filter)은 내부 group()에 전달되지 않습니다.

필터 또는 네임스페이스, 하위 도메인 등과 같은 다른 경로 구성 옵션을 적용하기 위해 경로를 그룹화할 수 있습니다. 그룹에 접두사를 추가할 필요 없이 접두사 대신 빈 문자열을 전달할 수 있으며, 그룹의 경로는 그룹이 존재하지 않지만 주어진 경로 구성 옵션을 사용하여 라우팅됩니다.

리버스(Reverse) 라우팅

리버스 라우팅은 링크와 연결해야 하는 모든 매개변수뿐만 아니라, 컨트롤러와 메소드를 정의하고, 라우터가 현재 경로를 조회하도록 할 수 있습니다. 이렇게 하면 어플리케이션 코드를 업데이트하지 않고도 경로 정의를 변경할 수 있습니다. 이것은 일반적으로 링크를 만들기 위해 뷰에서 사용됩니다.

다음 예는 연결하려는 상품에 대한 경로를 얻기 위해 route_to() 헬퍼 함수를 사용합니다. 첫 번째 매개 변수는 초기 경로 자체를 작성할 때 사용하는 것과 같이 정규화된 컨트롤러 및 메소드이며 이중 콜론(::)으로 구분합니다. 경로로 전달되어야하는 모든 매개 변수는 다음 매개 변수에 전달됩니다.

경로(route) 이름 지정

경로 이름과 함께 as 옵션을 전달하여 경로 이름을 지정할 수 있으며, 이름이 지정된 경로는 경로 정의가 변경되어도, `route_to()`로 구축된 링크에 대해 변경된 정보로 수정하지 않아도 계속 작동합니다.

라우트에 HTTP 동사(verbs) 사용

HTTP 동사(request method)를 사용하여 라우팅 규칙을 정의 할 수 있습니다. RESTFUL 어플리케이션을 빌드할 때 특히 유용합니다. 표준 HTTP 동사(GET, POST, PUT, DELETE 등)를 사용할 수 있습니다. 각 동사는 사용할 수 있는 고유한 메소드가 있습니다.

$routes->get('products', 'Product::feature');
$routes->post('products', 'Product::feature');
$routes->put('products/(:num)', 'Product::feature');
$routes->delete('products/(:num)', 'Product::feature');
    

match 메소드에 배열로 일치해야 하는 여러 동사에 경로를 제공할 수 있습니다.

$routes->match(['get', 'put'], 'products', 'Product::feature');