URI 라우팅 Routing

일반적으로 URL 문자열과 클래스/함수 간에는 1대1 관계를 이룹니다. URL 의 새그먼트는 통상 다음의 형태를 따릅니다:

example.com/class/function/id/

그러나 어떤 경우에는 위와 같은 1대1 매칭 대신 다른 클래스 나 함수를 호출하고자 할 때도 있을 것입니다.

예를 들어 여러분은 아래와 같은 형식의 URL 을 원한다고 합시다:

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

일반적으로 두 번째 새그먼트는 함수이름이 되어야하나, 위의 예에서는 함수이름대신 제품 ID 입니다. 이렇게 하려면 CodeIgniter 의 재매핑(remap) 기능을 사용하시면 됩니다.

나만의 라우팅 규칙 설정하기 Setting your own routing rules

라우팅 규칙은 application/config/routes.php 파일에 정의되어있습니다.해당파일을 보시면 $route 배열이 있는데 그 배열을 통해 여러분만의 라우팅 규칙을 설정할 수 있습니다.라우팅은 와일드카드(*) 나 정규표현식 으로도 설정할 수 있습니다.

와일드 카드 Wildcards

일반적인 와일드 카드 라우팅은 아래와 같이 설정합니다:

$route['product/:num'] = 'catalog/product_lookup';

라우팅 설정에서 배열의 키는 호출될 URI 를 나타내며, 배열의 값은 매핑될 도착지(실제로 사용자에게 보여질 URI)를 나타냅니다. 위 예제에서 요청되는 URL 의 첫 번째 새그먼트가 "product"이고 두 번째 새그먼트가 숫자 가 됩니다. 이런 URL 요청이 들어오면 자동으로 catalog 클래스의 product_lookup 함수가 호출됩니다.

라우팅에서 사용할 수 있는 와일드 카드는 아래와 같이 두 가지(숫자,모든 것)입니다:

(:num) 숫자로만 구성된 새그먼트와 일치합니다. (:any) 모든 문자와 일치합니다. (‘/’ 는 분리기호 부분이라 제외합니다.).

Note

와일드카드는 실제적으로 일반 정규식의 Alias 입니다. :any[^/]+ 를, :num[0-9]+ 를 나타냅니다.

Note

라우팅 설정은 상위에 설정된것이 하위에 설정된것보다 우선실행됩니다.

Note

라우팅 규칙은 필터하지 않습니다! 예를 들어 ‘foo/bar/(:num)’ 는 만약 숫자가 아닌 값이 오게 되면 컨트롤러 Foo 와 함수 bar 를 호출합니다.

예제

여기에 몇몇 라우팅 예제가 있습니다:

$route['journals'] = 'blogs';

URL 이 첫 번째 새그먼트로 “journals” 을 가지고있다면 “blogs” 클래스로 재매핑 됩니다.

$route['blog/joe'] = 'blogs/users/34';

URL 이 blog/joe 와 같은 새그먼트를 포함하고 있다면 “blogs” 클래스의 “users” 함수로 재미핑되며 ID 값으로 “34” 가 설정됩니다.

$route['product/(:any)'] = 'catalog/product_lookup';

URL 이 첫 새그먼트로 “product”를 포함하고 있고 두 번째 새그먼트가 숫자라면“catalog” 클래스의 “product_lookup” 함수로 재매핑 됩니다.

$route['product/(:num)'] = 'catalog/product_lookup_by_id/$1';

URL 이 첫 새그먼트로 “product” 를 포함하고 있고 두 번째 새그먼트가 숫자라면 “catalog” 클래스의“product_lookup_by_id” 함수로 연결되며 두 번째 새그먼트는 변수로서 함수에 전달돌것입니다.

Important

선행 / 후행 슬래시를 사용하지 마십시오.

정규표현식 Regular Expressions

라우팅 규칙을 설정하는데 정규표현식을 사용하고 싶다면 가능합니다. 어떤 정규표현식도 후위참조(back-references)로서 사용 가능합니다.

Note

후위참조(back-references)를 사용하실 때는 이중 백슬래쉬(\\)대신 달러($)를 사용해야 합니다.

정규표현식 경로설정은 일반적으로 다음의 형태를 가집니다:

$route['products/([a-z]+)/(\d+)'] = '$1/id_$2';

위 예제에서는, products/shirts/123 같은 경로가 “shirts” 컨트롤러의 “id_123” 함수로 매핑될 것입니다.

정규식으로, 여러 새그먼트의 중간에 새그먼트를 대표하는 슬래시(‘/’) 를 넣을 수 있습니다. 예를 들어, 만약 사용자가 패스워드로 보호된 페이지를 접근하는 경우, 그리고 로그인 후 같은 페이지로 리다이렉트하기를 원하는 경우, 이 예제가 유용할 것입니다:

$route['login/(.+)'] = 'auth/login/$1';

Note

위 예제에서, $1 가 슬래시(slash) 를 포함하고 있는 경우, Auth::login() 로 통과할 때 여러 파라미터로 분리되어 들어가게 될 것입니다.

정규식을 잘 모르고, 정규식에 관해 더 배우고 싶은 이들을 위해, regular-expressions.info 는 좋은 시작점이 될 수 있습니다.

Note

또한 와일드카드를 정규식과 혼합하고 매칭시킬 수 있습니다.

콜백 Callbacks

만약에 PHP >= 5.3 이상을 사용하신다면, 당신은 후위참조(back-references)를 실행하는 라우팅 룰의 자리에 콜백을 사용할 수 있습니다. 예제:

$route['products/([a-zA-Z]+)/edit/(\d+)'] = function ($product_type, $id)
{
        return 'catalog/product_edit/' . strtolower($product_type) . '/' . $id;
};

Using HTTP verbs in routes

It is possible to use HTTP verbs (request method) to define your routing rules. This is particularly useful when building RESTful applications. You can use standard HTTP verbs (GET, PUT, POST, DELETE, PATCH) or a custom one such (e.g. PURGE). HTTP verb rules are case-insensitive. All you need to do is to add the verb as an array key to your route. Example:

$route['products']['put'] = 'product/insert';

In the above example, a PUT request to URI “products” would call the Product::insert() controller method.

$route['products/(:num)']['DELETE'] = 'product/delete/$1';

A DELETE request to URL with “products” as first the segment and a number in the second will be mapped to the Product::delete() method, passing the numeric value as the first parameter.

Using HTTP verbs is of course, optional.

예약된 라우팅 경로 Reserved Routes

예약된 경로는 3가지가 있습니다:

$route['default_controller'] = 'welcome';

위 라우팅 경로는 URI 가 아무런 데이터도 포함하지않았을 때 어떤 컨트롤러가 로드 될지 나타냅니다. 루트경로를 호출했을 경우가 이에 해당합니다. 위 예제의 경우 “welcome” 클래스가 로드될것입니다. 항상 기본 라우팅경로를 설정해둘것을 권장합니다. 그렇지않으면 404 에러페이지를 기본으로 내보낼테니까요.

$route['404_override'] = '';

이 라우팅 경로는 요청된 컨트롤러가 없으면 어떤 컨트롤러를 불러야 여부를 지정하는 것입니다. 이 설정은 기본 설정된 404 페이지를 덮어 씁니다. application/views/errors/error_404.php 의 기본 error_404.php 파일을 로드하는 show_404() 함수에는 영향을주지 않습니다.

$route['translate_uri_dashes'] = FALSE;

As evident by the boolean value, this is not exactly a route. 이 옵션을 사용하면, 컨트롤로와 함수 URL 새그먼트에서, 대시 (‘-‘)를 언더바로 변경할 수 있습니다. 그러므로 추가 라우팅을 줄일 수 있습니다. 대시가 유효한 클래스나 함수명이 아니기 때문에, 이것을 사용하려고 하면 치명적인 에러를 야기할 수 있기 때문에 이 기능이 필요합니다.

Important

예약된경로는 어떤 와일드카드,정규표현식 경로보다 앞에 와야 합니다.