URI 라우팅
URI 라우팅이란 무엇인가요?
URI 라우팅은 URI를 컨트롤러의 메서드와 연결합니다.
CodeIgniter에는 두 가지 종류의 라우팅이 있습니다. 하나는 정의된 라우트 라우팅(Defined Route Routing)이고, 다른 하나는 자동 라우팅(Auto Routing)입니다. 정의된 라우트 라우팅을 사용하면 라우트를 수동으로 정의할 수 있어 유연한 URL 설정이 가능합니다. 자동 라우팅은 규칙(conventions)에 따라 HTTP 요청을 자동으로 라우팅하고 해당하는 컨트롤러 메서드를 실행하므로 라우트를 수동으로 정의할 필요가 없습니다.
먼저 정의된 라우트 라우팅에 대해 알아보겠습니다. 자동 라우팅을 사용하려면 자동 라우팅(향상)를 참조하십시오.
라우팅 규칙 설정
라우팅 규칙은 app/Config/Routes.php 파일에 정의됩니다. 이 파일에서 자신만의 라우팅 기준을 지정할 수 있게 해주는 RouteCollection 클래스의 인스턴스($routes)를 생성하는 것을 볼 수 있습니다. 라우트는 자리표시자(placeholders)나 정규 표현식을 사용하여 지정할 수 있습니다.
라우트를 지정할 때 HTTP 동사(요청 메서드)에 대응하는 메서드를 선택합니다. GET 요청을 처리하려면 get() 메서드를 사용합니다.
<?php
$routes->get('/', 'Home::index');
라우트는 왼쪽에 라우트 경로(Route Path)(BaseURL에 대한 상대적인 URI 경로, 예: /)를 받고, 이를 오른쪽에 있는 라우트 핸들러(Route Handler)(컨트롤러 및 메서드, 예: Home::index)와 컨트롤러에 전달할 매개변수에 매핑합니다.
컨트롤러와 메서드는 정적 메서드를 사용하는 것과 같은 방식으로, Users::list와 같이 클래스와 메서드를 이중 콜론(::)으로 구분하여 나열해야 합니다.
해당 메서드에 매개변수를 전달해야 하는 경우, 메서드 이름 뒤에 슬래시(/)로 구분하여 나열합니다.
<?php
// Calls $Users->list()
$routes->get('users', 'Users::list');
// Calls $Users->list(1, 23)
$routes->get('users/1/23', 'Users::list/1/23');
예제
다음은 몇 가지 기본적인 라우팅 예제입니다.
첫 번째 세그먼트에 journals라는 단어가 포함된 URL은 \App\Controllers\Blogs 클래스와 보통 index()인 기본 메서드로 매핑됩니다.
<?php
$routes->get('journals', 'Blogs');
blog/joe 세그먼트를 포함하는 URL은 \App\Controllers\Blogs 클래스와 users() 메서드에 매핑됩니다. ID는 34로 설정됩니다.
<?php
$routes->get('blog/joe', 'Blogs::users/34');
첫 번째 세그먼트가 product이고 두 번째 세그먼트에 무엇이든 오는 URL은 \App\Controllers\Catalog 클래스와 productLookup() 메서드에 매핑됩니다.
<?php
$routes->get('product/(:segment)', 'Catalog::productLookup');
첫 번째 세그먼트가 product이고 두 번째 세그먼트에 숫자가 오는 URL은 \App\Controllers\Catalog 클래스와 productLookupByID() 메서드에 매핑되며, 일치하는 숫자를 메서드의 변수로 전달합니다.
<?php
$routes->get('product/(:num)', 'Catalog::productLookupByID/$1');
HTTP 동사 라우트
표준 HTTP 동사(GET, POST, PUT, DELETE, OPTIONS 등)를 모두 사용할 수 있습니다.
<?php
$routes->post('products', 'Product::feature');
$routes->put('products/1', 'Product::feature');
$routes->delete('products/1', 'Product::feature');
match() 메서드에 배열로 전달하여 하나의 라우트가 여러 동사에 일치하도록 지정할 수 있습니다.
<?php
$routes->match(['GET', 'PUT'], 'products', 'Product::feature');
라우트 핸들러 지정
컨트롤러 네임스페이스
컨트롤러와 메서드 이름을 문자열로 지정할 때, 컨트롤러 이름 앞에 \가 없으면 기본 네임스페이스가 앞에 붙습니다.
<?php
// Routes to \App\Controllers\Api\Users::update()
$routes->post('api/users', 'Api\Users::update');
맨 앞에 \를 붙이면 전체 경로 클래스 이름(fully qualified class name)으로 취급됩니다.
<?php
// Routes to \Acme\Blog\Controllers\Home::list()
$routes->get('blog', '\Acme\Blog\Controllers\Home::list');
namespace 옵션을 사용하여 네임스페이스를 명시적으로 지정할 수도 있습니다.
<?php
// Routes to \Admin\Users::index()
$routes->get('admin/users', 'Users::index', ['namespace' => 'Admin']);
자세한 내용은 네임스페이스 지정를 참조하십시오.
배열 콜러블(Array Callable) 구문
Added in version 4.2.0.
v4.2.0부터는 배열 콜러블 구문을 사용하여 컨트롤러를 지정할 수 있습니다.
$routes->get('/', [\App\Controllers\Home::class, 'index']);
또는 use 키워드를 사용할 수 있습니다.
use App\Controllers\Home;
$routes->get('/', [Home::class, 'index']);
use App\Controllers\Home; 추가를 잊으면 컨트롤러 클래스 이름이 App\Controllers\Home이 아닌 \Home으로 해석됩니다.
참고
배열 콜러블 구문을 사용할 때 클래스 이름은 항상 전체 경로 클래스 이름으로 해석됩니다. 따라서 기본 네임스페이스와 namespace 옵션은 적용되지 않습니다.
배열 콜러블 구문과 자리표시자
자리표시자가 있는 경우, 지정된 순서대로 매개변수가 자동으로 설정됩니다.
use App\Controllers\Product;
$routes->get('product/(:num)/(:num)', [Product::class, 'index']);
// The above code is the same as the following:
$routes->get('product/(:num)/(:num)', 'Product::index/$1/$2');
하지만 라우트에 정규 표현식을 사용하는 경우 자동 설정된 매개변수가 올바르지 않을 수 있습니다. 이런 경우에는 매개변수를 수동으로 지정할 수 있습니다.
use App\Controllers\Product;
$routes->get('product/(:num)/(:num)', [[Product::class, 'index'], '$2/$1']);
// The above code is the same as the following:
$routes->get('product/(:num)/(:num)', 'Product::index/$2/$1');
클로저(Closures) 사용
익명 함수인 클로저를 라우트의 목적지로 사용할 수 있습니다. 사용자가 해당 URI에 접속하면 이 함수가 실행됩니다. 이는 작은 작업을 빠르게 실행하거나 단순히 뷰를 보여줄 때 유용합니다.
<?php
use App\Libraries\RSSFeeder;
$routes->get('feed', static function () {
$rss = new RSSFeeder();
return $rss->feed('general');
});
라우트 경로 지정
자리표시자(Placeholders)
전형적인 라우트는 다음과 같은 모습일 것입니다.
<?php
$routes->get('product/(:num)', 'Catalog::productLookup');
라우트에서 첫 번째 매개변수는 매칭할 URI를 포함하고, 두 번째 매개변수는 라우팅될 목적지를 포함합니다. 위의 예에서 URL 경로의 첫 번째 세그먼트가 “product”이고 두 번째 세그먼트가 숫자라면, Catalog 클래스와 productLookup 메서드가 대신 사용됩니다.
자리표시자는 단순히 정규 표현식 패턴을 나타내는 문자열입니다. 라우팅 과정에서 이러한 자리표시자들은 정규 표현식 값으로 대체됩니다. 주로 가독성을 위해 사용됩니다.
라우트에서 사용할 수 있는 자리표시자는 다음과 같습니다.
자리표시자(Placeholders) |
설명 |
|---|---|
(:any) |
해당 지점부터 URI 끝까지의 모든 문자와 일치합니다. 여기에는 여러 URI 세그먼트가 포함될 수 있습니다. |
(:segment) |
슬래시( |
(:num) |
모든 양의 정수와 일치합니다. |
(:alpha) |
알파벳 문자로만 구성된 문자열과 일치합니다. |
(:alphanum) |
알파벳 문자나 정수, 또는 그 조합으로 구성된 문자열과 일치합니다. |
(:hash) |
|
참고
{locale}은 다국어화(localization)를 위해 예약되어 있으므로 자리표시자나 라우트의 다른 부분으로 사용할 수 없습니다.
(:any)의 동작
단일 (:any)는 URL에 여러 세그먼트가 있을 경우 이를 모두 포함하여 일치하게 됨에 유의하십시오.
예를 들어 다음 라우트는
<?php
$routes->get('product/(:any)', 'Catalog::productLookup/$1');
product/123, product/123/456, product/123/456/789 등과 일치합니다.
기본적으로 위의 예에서 $1 자리표시자에 슬래시(/)가 포함되어 있다면, Catalog::productLookup()에 전달될 때 여전히 여러 매개변수로 분리됩니다.
참고
v4.5.0부터는 설정 옵션을 통해 이 동작을 변경할 수 있습니다. 자세한 내용은 하나의 매개변수로서의 여러 URI 세그먼트를 참조하십시오.
컨트롤러의 구현은 최대 매개변수 개수를 고려해야 합니다.
<?php
namespace App\Controllers;
class Catalog extends BaseController
{
public function productLookup($seg1 = false, $seg2 = false, $seg3 = false)
{
echo $seg1; // Will be 123 in all examples
echo $seg2; // false in first, 456 in second and third example
echo $seg3; // false in first and second, 789 in third
}
}
또는 가변 길이 인수 목록을 사용할 수 있습니다.
<?php
namespace App\Controllers;
class Catalog extends BaseController
{
public function productLookup(...$params)
{
echo $params[0] ?? null; // Will be 123 in all examples
echo $params[1] ?? null; // null in first, 456 in second and third example
echo $params[2] ?? null; // null in first and second, 789 in third
}
}
중요
(:any) 뒤에는 어떠한 자리표시자도 두지 마십시오. 컨트롤러 메서드에 전달되는 매개변수의 개수가 변경될 수 있기 때문입니다.
여러 세그먼트를 매칭하는 것이 의도한 동작이 아니라면, 라우트를 정의할 때 (:segment)를 사용해야 합니다. 위의 예제 URL들을 사용하면 다음과 같습니다.
<?php
$routes->get('product/(:segment)', 'Catalog::productLookup/$1');
이 설정은 product/123만 매칭하며, 다른 예제들에 대해서는 404 에러를 발생시킵니다.
커스텀 자리표시자
라우트 파일에서 사용할 자신만의 자리표시자를 만들어 경험과 가독성을 완전히 커스터마이징할 수 있습니다.
addPlaceholder() 메서드를 사용하여 새로운 자리표시자를 추가합니다. 첫 번째 매개변수는 자리표시자로 사용할 문자열이고, 두 번째 매개변수는 대체될 정규 표현식 패턴입니다. 이는 라우트를 추가하기 전에 호출되어야 합니다.
<?php
$routes->addPlaceholder('uuid', '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}');
$routes->get('users/(:uuid)', 'Users::show/$1');
정규 표현식
원한다면 정규 표현식을 사용하여 라우팅 규칙을 정의할 수 있습니다. 유효한 모든 정규 표현식이 허용되며 역참조(back-references)도 가능합니다.
중요
참고: 역참조를 사용하는 경우 이중 백슬래시 구문 대신 달러($) 구문을 사용해야 합니다. 전형적인 정규 표현식 라우트는 다음과 같은 모습일 것입니다.
<?php
$routes->get('products/([a-z]+)/(\d+)', 'Products::show/$1/id_$2');
위의 예에서 products/shirts/123과 유사한 URI는 Products 컨트롤러 클래스의 show() 메서드를 호출하며, 원래의 첫 번째와 두 번째 세그먼트가 메서드 인수로 전달됩니다.
정규 표현식을 사용하면 일반적으로 여러 세그먼트 사이의 구분자를 나타내는 슬래시(/)가 포함된 세그먼트도 캡처할 수 있습니다.
예를 들어, 사용자가 웹 애플리케이션의 비밀번호로 보호된 영역에 접근할 때 로그인 후 동일한 페이지로 리다이렉트하고 싶다면 다음 예제가 유용할 것입니다.
<?php
$routes->get('login/(.+)', 'Auth::login/$1');
기본적으로 위의 예에서 $1 자리표시자에 슬래시(/)가 포함되어 있다면, Auth::login()에 전달될 때 여전히 여러 매개변수로 분리됩니다.
참고
v4.5.0부터는 설정 옵션을 통해 이 동작을 변경할 수 있습니다. 자세한 내용은 하나의 매개변수로서의 여러 URI 세그먼트를 참조하십시오.
정규 표현식을 모르거나 더 배우고 싶다면 regular-expressions.info가 좋은 시작점이 될 수 있습니다.
참고
자리표시자와 정규 표현식을 혼합하여 사용할 수도 있습니다.
뷰 라우트
Added in version 4.3.0.
로직이 필요 없이 단순히 뷰를 렌더링하고 싶다면 view() 메서드를 사용할 수 있습니다. 이는 항상 GET 요청으로 취급됩니다. 이 메서드는 두 번째 매개변수로 로드할 뷰의 이름을 받습니다.
<?php
// Displays the view in /app/Views/pages/about.php
$routes->view('about', 'pages/about');
라우트 내에 자리표시자를 사용하는 경우, 뷰 내에서 $segments라는 특별한 변수를 통해 접근할 수 있습니다. 이들은 라우트에 나타나는 순서대로 인덱싱된 배열로 제공됩니다.
<?php
// Displays the view in /app/Views/map.php
$routes->view('map/(:segment)/(:segment)', 'map');
// Within the view, you can access the segments with
// $segments[0] and $segments[1] respectively.
리다이렉트 라우트
오랫동안 운영되는 사이트라면 페이지 위치가 변경되기 마련입니다. addRedirect() 메서드를 사용하여 다른 라우트로 리다이렉트해야 하는 라우트를 지정할 수 있습니다. 첫 번째 매개변수는 이전 라우트의 URI 패턴입니다. 두 번째 매개변수는 리다이렉트할 새 URI이거나 명명된 라우트(named route)의 이름입니다. 세 번째 매개변수는 리다이렉트와 함께 전송할 HTTP 상태 코드입니다. 기본값은 302(임시 리다이렉트)이며 대부분의 경우에 권장됩니다.
<?php
$routes->get('users/profile', 'Users::profile', ['as' => 'profile']);
// Redirect to a named route
$routes->addRedirect('users/about', 'profile');
// Redirect to a URI
$routes->addRedirect('users/about', 'users/profile');
// Redirect with placeholder
$routes->get('post/(:num)/comment/(:num)', 'PostsComments::index', ['as' => 'post.comment']);
// Redirect to a URI
$routes->addRedirect('article/(:num)/(:num)', 'post/$1/comment/$2');
// Redirect to a named route
$routes->addRedirect('article/(:num)/(:num)', 'post.comment');
참고
v4.2.0부터 addRedirect()에서 자리표시자를 사용할 수 있습니다.
페이지를 불러오는 중에 리다이렉트 라우트가 일치하면, 컨트롤러가 로드되기 전에 사용자는 즉시 새 페이지로 리다이렉트됩니다.
환경 제한
특정 환경에서만 볼 수 있는 라우트 집합을 만들 수 있습니다. 이를 통해 개발자만 로컬 머신에서 사용할 수 있고 테스트나 운영 서버에서는 접근할 수 없는 도구를 만들 수 있습니다. 이는 environment() 메서드로 할 수 있습니다. 첫 번째 매개변수는 환경 이름입니다. 이 클로저 안에서 정의된 라우트는 지정한 환경에서만 접근할 수 있습니다:
<?php
$routes->environment('development', static function ($routes) {
$routes->get('builder', 'Tools\Builder::index');
});
모든 HTTP 동사의 라우트
중요
이 메서드는 하위 호환성을 위해서만 존재합니다. 새 프로젝트에서는 사용하지 마십시오. 이미 사용 중이더라도 더 적절한 다른 메서드를 사용하는 것이 좋습니다.
경고
add() 메서드는 편리해 보이지만, 앞에서 설명한 HTTP 동사 기반 라우트를 항상 사용하는 것이 더 안전합니다. CSRF 보호를 사용하더라도 GET 요청은 보호하지 않습니다. add() 메서드에 지정한 URI가 GET 메서드로 접근 가능하다면 CSRF 보호는 작동하지 않습니다.
어떤 HTTP 동사로든 라우트를 정의할 수 있습니다. add() 메서드를 사용하면 됩니다:
<?php
$routes->add('products', 'Product::feature');
참고
HTTP 동사 기반 라우트를 사용하면 현재 요청 메서드와 일치하는 라우트만 저장되므로, 찾을 때 검색해야 하는 라우트 수가 줄어 약간의 성능 향상도 얻을 수 있습니다.
여러 라우트 매핑
중요
이 메서드는 하위 호환성을 위해서만 존재합니다. 새 프로젝트에서는 사용하지 마십시오. 이미 사용 중이더라도 더 적절한 다른 메서드를 사용하는 것이 좋습니다.
경고
map() 메서드도 내부적으로 add()를 호출하므로 add()와 마찬가지로 권장되지 않습니다.
add() 메서드는 사용하기 쉽지만, 여러 라우트를 한 번에 다룰 때는 map() 메서드가 더 편리한 경우가 많습니다. 추가할 각 라우트마다 add() 메서드를 호출하는 대신, 라우트 배열을 정의한 다음 첫 번째 매개변수로 map() 메서드에 전달할 수 있습니다:
<?php
$multipleRoutes = [
'product/(:num)' => 'Catalog::productLookupById',
'product/(:alphanum)' => 'Catalog::productLookupByName',
];
$routes->map($multipleRoutes);
명령줄 전용 라우트
참고
CLI 스크립트에는 컨트롤러를 CLI로 호출하는 대신 Spark 명령을 사용하는 것이 좋습니다. 자세한 내용은 Spark 명령 만들기 페이지를 참조하십시오.
HTTP 동사 기반 라우트 메서드로 생성된 라우트는 CLI에서 사용할 수 없지만, add() 메서드로 생성된 라우트는 명령줄에서 계속 사용할 수 있습니다.
명령줄에서만 동작하고 웹 브라우저에서는 접근할 수 없는 라우트를 cli() 메서드로 만들 수 있습니다:
<?php
$routes->cli('migrate', 'App\Database::migrate');
경고
Auto Routing (Legacy)를 활성화하고 명령 파일을 app/Controllers에 두면, 누구나 HTTP를 통해 Auto Routing (Legacy)의 도움으로 해당 명령에 접근할 수 있습니다.
전역 옵션
라우트를 생성하는 모든 메서드(get(), post(), resource() 등)는 생성된 라우트를 수정하거나 더 제한할 수 있는 옵션 배열을 받을 수 있습니다. $options 배열은 항상 마지막 매개변수입니다:
<?php
$routes->add('from', 'to', $options);
$routes->get('from', 'to', $options);
$routes->post('from', 'to', $options);
$routes->put('from', 'to', $options);
$routes->head('from', 'to', $options);
$routes->options('from', 'to', $options);
$routes->delete('from', 'to', $options);
$routes->patch('from', 'to', $options);
$routes->match(['GET', 'PUT'], 'from', 'to', $options);
$routes->resource('photos', $options);
$routes->map($array, $options);
$routes->group('name', $options, static function () {});
필터 적용
컨트롤러 전후에 실행할 필터를 지정하여 특정 라우트의 동작을 변경할 수 있습니다. 이는 인증이나 API 로깅 시 특히 유용합니다.
필터 값은 문자열 하나 또는 문자열 배열일 수 있습니다:
app/Config/Filters.php에 정의된 별칭과 일치합니다.필터 클래스 이름
별칭 정의에 대한 자세한 내용은 Controller Filters를 참조하십시오.
경고
필터를 app/Config/Routes.php에서 라우트에 지정한 경우(app/Config/Filters.php가 아님), Auto Routing (Legacy)를 비활성화하는 것이 좋습니다. Auto Routing (Legacy)가 활성화되어 있으면 컨트롤러가 설정된 라우트와 다른 URL로 접근될 수 있으며, 이 경우 라우트에 지정한 필터가 적용되지 않을 수 있습니다. 자동 라우팅을 비활성화하려면 정의된 라우트만 사용를 참조하십시오.
별칭 필터
필터 값으로 app/Config/Filters.php에 정의된 별칭을 지정합니다:
<?php
$routes->get('admin', ' AdminController::index', ['filter' => 'admin-auth']);
또한 별칭 필터의 before() 및 after() 메서드에 전달할 인수도 지정할 수 있습니다:
<?php
$routes->post('users/delete/(:segment)', 'AdminController::index', ['filter' => 'admin-auth:dual,noreturn']);
클래스 이름 필터
Added in version 4.1.5.
필터 값으로 필터 클래스 이름을 지정할 수 있습니다:
<?php
$routes->get('admin', ' AdminController::index', ['filter' => \App\Filters\SomeFilter::class]);
다중 필터
Added in version 4.1.5.
중요
v4.5.0부터 Multiple Filters는 항상 활성화됩니다. v4.5.0 이전에는 Multiple Filters가 기본적으로 비활성화되어 있었습니다. v4.5.0 이전 버전에서 사용하려면 자세한 내용은 4.1.4에서 4.1.5로 업그레이드를 참조하십시오.
필터 값에 배열을 지정할 수 있습니다:
<?php
$routes->get('admin', ' AdminController::index', ['filter' => ['admin-auth', \App\Filters\SomeFilter::class]]);
필터 인수
필터에 추가 인수를 전달할 수 있습니다:
<?php
$routes->add('users/delete/(:segment)', 'AdminController::index', ['filter' => 'admin-auth:dual,noreturn']);
이 예제에서는 배열 ['dual', 'noreturn']이 필터의 before() 및 after() 구현 메서드의 $arguments로 전달됩니다.
네임스페이스 지정
생성된 컨트롤러 앞에는 기본 네임스페이스가 붙지만, namespace 옵션을 사용하여 옵션 배열에서 다른 네임스페이스를 지정할 수도 있습니다. 값은 수정하려는 네임스페이스여야 합니다:
<?php
// Routes to \Admin\Users::index()
$routes->get('admin/users', 'Users::index', ['namespace' => 'Admin']);
새 네임스페이스는 get, post 등 단일 라우트를 생성하는 메서드 호출에만 적용됩니다. 여러 라우트를 생성하는 메서드의 경우에는 해당 함수로 생성된 모든 라우트에 새 네임스페이스가 적용되며, group()의 경우에는 클로저 안에서 생성된 모든 라우트에 적용됩니다.
호스트 이름으로 제한
옵션 배열의 일부로 허용할 원하는 도메인과 함께 hostname 옵션을 전달하면, 라우트 그룹이 애플리케이션의 특정 도메인 또는 서브도메인에서만 동작하도록 제한할 수 있습니다:
<?php
$routes->get('from', 'to', ['hostname' => 'accounts.example.com']);
이 예제는 도메인이 정확히 accounts.example.com과 일치할 때만 지정한 호스트가 동작하도록 허용합니다. 메인 사이트 example.com에서는 동작하지 않습니다.
여러 호스트 이름으로 제한
Added in version 4.6.0.
또한 여러 호스트 이름으로 제한할 수도 있습니다. 예:
<?php
$routes->get('from', 'to', ['hostname' => ['s1.example.com', 's2.example.com']]);
서브도메인으로 제한
subdomain 옵션이 있으면 시스템은 라우트를 해당 서브도메인에서만 사용할 수 있도록 제한합니다. 이 서브도메인을 통해 애플리케이션을 보고 있을 때만 라우트가 일치합니다:
<?php
// Limit to media.example.com
$routes->get('from', 'to', ['subdomain' => 'media']);
값을 별표(*)로 설정하면 모든 서브도메인으로 제한할 수 있습니다. 서브도메인이 없는 URL에서 보고 있다면 일치하지 않습니다:
<?php
// Limit to any sub-domain
$routes->get('from', 'to', ['subdomain' => '*']);
중요
시스템이 완벽하지는 않으며, 운영 환경에서 사용하기 전에 특정 도메인에서 테스트해야 합니다. 대부분의 도메인은 잘 작동하지만, 도메인 자체에 마침표가 있는 일부 예외 사례(접미사나 www를 구분하는 데 쓰이지 않는 경우)는 잘못된 양성(false positive)을 유발할 수 있습니다.
일치한 매개변수 오프셋
offset 옵션을 사용하면 라우트에서 일치한 매개변수를 임의의 숫자만큼 오프셋할 수 있으며, 값은 오프셋할 세그먼트 수입니다.
첫 번째 URI 세그먼트가 버전 번호인 API를 개발할 때 유용할 수 있습니다. 첫 번째 매개변수가 언어 문자열일 때도 사용할 수 있습니다:
<?php
$routes->get('users/(:num)', 'users/show/$1', ['offset' => 1]);
// Creates:
$routes['users/(:num)'] = 'users/show/$2';
역방향 라우팅
역방향 라우팅을 사용하면 링크가 이동해야 할 컨트롤러와 메서드, 그리고 필요한 매개변수를 정의하고, 라우터가 해당 현재 라우트를 찾도록 할 수 있습니다. 이를 통해 애플리케이션 코드를 수정하지 않고도 라우트 정의를 변경할 수 있습니다. 보통 뷰에서 링크를 만들 때 사용합니다.
예를 들어 연결할 사진 갤러리 라우트가 있다면, url_to() 헬퍼 함수를 사용해 사용해야 할 라우트를 가져올 수 있습니다. 첫 번째 매개변수는 두 개의 콜론(::)으로 구분된 완전한 컨트롤러와 메서드이며, 초기 라우트를 작성할 때와 거의 같습니다. 라우트에 전달해야 하는 매개변수는 그다음에 전달합니다:
<?php
// The route is defined as:
$routes->get('users/(:num)/gallery/(:num)', 'Galleries::showUserGallery/$1/$2');
?>
<!-- Generate the URI to link to user ID 15, gallery 12: -->
<a href="<?= url_to('Galleries::showUserGallery', 15, 12) ?>">View Gallery</a>
<!-- Result: 'http://example.com/users/15/gallery/12' -->
이름 있는 라우트
라우트에 이름을 붙이면 애플리케이션의 취약성을 줄일 수 있습니다. 이는 나중에 호출할 수 있도록 라우트에 이름을 부여하는 기능이며, 라우트 정의가 바뀌더라도 url_to()로 만든 애플리케이션 내 링크는 변경 없이 그대로 동작합니다. 라우트 이름은 as 옵션에 이름을 전달해서 지정합니다:
<?php
// The route is defined as:
$routes->get('users/(:num)/gallery/(:num)', 'Galleries::showUserGallery/$1/$2', ['as' => 'user_gallery']);
?>
<!-- Generate the URI to link to user ID 15, gallery 12: -->
<a href="<?= url_to('user_gallery', 15, 12) ?>">View Gallery</a>
<!-- Result: 'http://example.com/users/15/gallery/12' -->
이것은 뷰를 더 읽기 쉽게 만든다는 추가 이점도 있습니다.
참고
기본적으로 정의된 모든 라우트는 경로와 같은 이름을 가집니다. 플레이스홀더는 대응하는 정규식으로 대체됩니다. 예를 들어 $routes->get('edit/(:num)', 'PostController::edit/$1'); 같은 라우트를 정의했다면 route_to('edit/([0-9]+)', 12)로 대응하는 URL을 생성할 수 있습니다.
경고
라우트 우선순위에 따르면, 이름 없는 라우트가 먼저 정의된 뒤 같은 경로 이름을 가진 명명된 라우트가 나중에 정의되면, 두 번째 라우트는 자동 할당된 첫 번째 라우트 이름과 충돌하므로 등록되지 않습니다.
라우트 그룹화
group() 메서드를 사용하면 라우트를 공통 이름 아래로 묶을 수 있습니다. 그룹 이름은 그룹 안에 정의된 라우트보다 앞에 오는 세그먼트가 됩니다. 이렇게 하면 admin 영역처럼 같은 시작 문자열을 공유하는 많은 라우트를 만들 때 필요한 타이핑을 줄일 수 있습니다:
<?php
$routes->group('admin', static function ($routes) {
$routes->get('users', 'Admin\Users::index');
$routes->get('blog', 'Admin\Blog::index');
});
이렇게 하면 users 및 blog URI 앞에 admin이 붙어 admin/users 및 admin/blog를 처리합니다.
네임스페이스 설정
그룹에 옵션을 할당해야 한다면 네임스페이스 지정를 참고하여 콜백보다 앞서 지정하세요:
<?php
$routes->group('api', ['namespace' => 'App\API\v1'], static function ($routes) {
$routes->resource('users');
});
이렇게 하면 api/users URI의 App\API\v1\Users 컨트롤러에 대한 리소스 라우트를 처리합니다.
필터 설정
그룹 라우트에 특정 filter를 사용할 수도 있습니다. 이는 컨트롤러 전이나 후에 항상 필터를 실행합니다. 인증이나 API 로깅에 특히 유용합니다:
<?php
$routes->group('api', ['filter' => 'api-auth'], static function ($routes) {
$routes->resource('users');
});
필터 값은 app/Config/Filters.php에 정의된 별칭 중 하나와 일치해야 합니다.
참고
v4.5.4 이전에는 버그 때문에 group()에 전달된 필터가 내부 라우트에 전달된 필터와 병합되지 않았습니다.
기타 옵션 설정
경우에 따라 namespace, subdomain 등 다른 라우트 설정 옵션을 적용하기 위해 라우트를 그룹화하고 싶을 수 있습니다. 그룹에 접두사를 반드시 추가할 필요가 없다면 접두사 대신 빈 문자열을 전달할 수 있으며, 그룹 내 라우트는 그룹이 존재하지 않는 것처럼 라우팅되지만 지정한 라우트 설정 옵션은 적용됩니다:
<?php
$routes->group('', ['namespace' => 'Myth\Auth\Controllers'], static function ($routes) {
$routes->get('login', 'AuthController::login', ['as' => 'login']);
$routes->post('login', 'AuthController::attemptLogin');
$routes->get('logout', 'AuthController::logout');
});
그룹 중첩
필요하다면 더 세밀한 구성을 위해 그룹 안에 그룹을 중첩할 수 있습니다:
<?php
$routes->group('admin', ['filter' => 'myfilter1:config'], static function ($routes) {
$routes->get('/', 'Admin\Admin::index');
$routes->group('users', ['filter' => 'myfilter2:region'], static function ($routes) {
$routes->get('list', 'Admin\Users::list');
});
});
이렇게 하면 admin/users/list URL을 처리합니다.
바깥쪽 group()에 전달된 filter 옵션은 안쪽 group()의 필터 옵션과 병합됩니다. 위 코드는 admin 라우트에 myfilter1:config를 실행하고, admin/users/list 라우트에 myfilter1:config와 myfilter2:region을 실행합니다.
참고
v4.6.0 이전에는 동일한 필터를 서로 다른 인수로 여러 번 실행할 수 없었습니다.
안쪽 group()에 전달된 다른 겹치는 옵션은 해당 값으로 덮어씌워집니다.
참고
v4.5.0 이전에는 버그로 인해 바깥쪽 group()에 전달된 옵션이 안쪽 group() 옵션과 병합되지 않았습니다.
라우트 우선순위
라우트는 정의된 순서대로 라우팅 테이블에 등록됩니다. 즉, URI에 접근하면 먼저 일치하는 라우트가 실행됩니다.
경고
서로 다른 핸들러로 같은 라우트 경로가 두 번 이상 정의되면, 먼저 정의된 라우트만 등록됩니다.
라우팅 테이블에 등록된 라우트는 spark routes 명령으로 확인할 수 있습니다.
라우트 우선순위 변경
모듈을 사용할 때 애플리케이션의 라우트에 와일드카드가 포함되어 있으면 문제가 될 수 있습니다. 그러면 모듈 라우트가 올바르게 처리되지 않습니다. priority 옵션을 사용해 라우트 처리 우선순위를 낮추면 이 문제를 해결할 수 있습니다. 이 매개변수는 양의 정수와 0을 받을 수 있습니다. priority에서 지정한 숫자가 클수록 처리 큐에서의 라우트 우선순위는 낮아집니다:
<?php
// First you need to enable processing of the routes queue by priority.
$routes->setPrioritize();
// Config\Routes
$routes->get('(.*)', 'Posts::index', ['priority' => 1]);
// Modules\Acme\Config\Routes
$routes->get('admin', 'Admin::index');
// The "admin" route will now be processed before the wildcard route.
이 기능을 비활성화하려면 메서드를 false 인수로 호출해야 합니다:
<?php
$routes->setPrioritize(false);
참고
기본적으로 모든 라우트의 우선순위는 0입니다. 음의 정수는 절대값으로 변환됩니다.
라우트 구성 옵션
RoutesCollection 클래스는 모든 라우트에 영향을 주는 여러 옵션을 제공하며, 애플리케이션의 요구에 맞게 수정할 수 있습니다. 이러한 옵션은 app/Config/Routing.php에서 사용할 수 있습니다.
참고
구성 파일 app/Config/Routing.php는 v4.4.0부터 추가되었습니다. 이전 버전에서는 app/Config/Routes.php에서 설정을 변경하기 위해 setter 메서드를 사용했습니다.
기본 네임스페이스
라우트에 컨트롤러를 매칭할 때 라우터는 라우트에 지정된 컨트롤러 앞에 기본 네임스페이스 값을 추가합니다. 기본값은 App\Controllers입니다.
값을 빈 문자열('')로 설정하면 각 라우트에서 전체 네임스페이스가 포함된 컨트롤러를 지정해야 합니다:
<?php
// In app/Config/Routing.php
use CodeIgniter\Config\Routing as BaseRouting;
// ...
class Routing extends BaseRouting
{
// ...
public string $defaultNamespace = '';
// ...
}
// In app/Config/Routes.php
// Controller is \Users
$routes->get('users', 'Users::index');
// Controller is \Admin\Users
$routes->get('users', 'Admin\Users::index');
컨트롤러에 네임스페이스를 명시하지 않았다면 이 값을 변경할 필요가 없습니다. 컨트롤러에 네임스페이스를 사용한다면 이 값을 변경해 입력을 줄일 수 있습니다:
<?php
// This can be overridden in app/Config/Routes.php
$routes->setDefaultNamespace('App');
// Controller is \App\Users
$routes->get('users', 'Users::index');
// Controller is \App\Admin\Users
$routes->get('users', 'Admin\Users::index');
기본 메서드
이 설정은 라우트 핸들러에 컨트롤러 이름만 있고 메서드 이름이 없는 경우에 사용됩니다. 기본값은 index입니다.
// In app/Config/Routing.php
public string $defaultMethod = 'index';
참고
$defaultMethod는 Auto Routing에서도 자주 사용됩니다. 자세한 내용은 Auto Routing (Improved) 또는 Auto Routing (Legacy)를 참조하십시오.
다음 라우트를 정의하면:
$routes->get('/', 'Home');
App\Controllers\Home 컨트롤러의 index() 메서드는 라우트가 일치할 때 실행됩니다.
참고
_로 시작하는 메서드 이름은 기본 메서드로 사용할 수 없습니다. 그러나 v4.5.0부터는 __invoke 메서드를 사용할 수 있습니다.
URI의 대시 변환
이 옵션을 사용하면 Auto Routing에서 컨트롤러와 메서드 URI 세그먼트의 대시(-)를 밑줄(_)로 자동 변환할 수 있어, 그렇게 해야 할 때 추가 라우트 항목을 줄일 수 있습니다. 대시는 클래스 이름이나 메서드 이름의 유효한 문자가 아니므로, 이를 사용하려고 하면 치명적 오류가 발생하기 때문입니다:
<?php
// In app/Config/Routing.php
use CodeIgniter\Config\Routing as BaseRouting;
// ...
class Routing extends BaseRouting
{
// ...
public bool $translateURIDashes = true;
// ...
}
// This can be overridden in app/Config/Routes.php
$routes->setTranslateURIDashes(true);
참고
Auto Routing (Improved)를 사용할 때 v4.4.0 이전에는 $translateURIDashes가 true이면 두 개의 URI가 하나의 컨트롤러 메서드에 대응했습니다. 대시용 URI(예: foo-bar)와 밑줄용 URI(예: foo_bar)가 그것입니다. 이는 잘못된 동작이었습니다. v4.4.0부터는 밑줄용 URI(foo_bar)에 접근할 수 없습니다.
정의된 라우트만 사용
v4.2.0부터 자동 라우팅은 기본적으로 비활성화되어 있습니다.
URI와 일치하는 정의된 라우트를 찾지 못하면, Auto Routing이 활성화되어 있을 때 시스템은 해당 URI를 컨트롤러와 메서드에 매칭하려고 시도합니다.
이 자동 매칭을 비활성화하고 자신이 정의한 라우트만 허용하려면 $autoRoute 속성을 false로 설정하면 됩니다:
<?php
// In app/Config/Routing.php
use CodeIgniter\Config\Routing as BaseRouting;
// ...
class Routing extends BaseRouting
{
// ...
public bool $autoRoute = false;
// ...
}
// This can be overridden in app/Config/Routes.php
$routes->setAutoRoute(false);
경고
CSRF 보호를 사용하더라도 GET 요청은 보호하지 않습니다. URI가 GET 메서드로 접근 가능하다면 CSRF 보호는 작동하지 않습니다.
404 오버라이드
현재 URI와 일치하는 페이지를 찾지 못하면 시스템은 기본 404 보기를 표시합니다. 라우팅 구성 파일에서 $override404 속성을 사용해 404 라우트의 컨트롤러 클래스/메서드를 정의할 수 있습니다.
<?php
// In app/Config/Routing.php
use CodeIgniter\Config\Routing as BaseRouting;
// ...
class Routing extends BaseRouting
{
// ...
public ?string $override404 = 'App\Errors::show404';
// ...
}
Routes 구성 파일의 set404Override() 메서드로 수행할 작업을 지정하여 동작을 바꿀 수도 있습니다. 값은 유효한 클래스/메서드 쌍 또는 클로저일 수 있습니다:
<?php
// In app/Config/Routes.php
// Would execute the show404 method of the App\Errors class
$routes->set404Override('App\Errors::show404');
// Will display a custom view.
$routes->set404Override(static function () {
// If you want to get the URI segments.
$segments = request()->getUri()->getSegments();
return view('my_errors/not_found.html');
});
참고
v4.5.0부터 404 Override 기능은 기본적으로 Response 상태 코드를 404로 설정합니다. 이전 버전에서는 코드가 200이었습니다. 컨트롤러에서 상태 코드를 바꾸려면 CodeIgniterHTTPResponse::setStatusCode()를 참고하십시오.
우선순위에 따른 라우트 처리
라우트 큐를 우선순위에 따라 처리할지 여부를 켜거나 끕니다. 우선순위를 낮추는 설정은 라우트 옵션으로 지정합니다. 기본값은 비활성화입니다. 이 기능은 모든 라우트에 영향을 미칩니다. 우선순위를 낮추는 사용 예는 라우트 우선순위를 참고하십시오:
<?php
// In app/Config/Routing.php
use CodeIgniter\Config\Routing as BaseRouting;
// ...
class Routing extends BaseRouting
{
// ...
public bool $prioritize = true;
// ...
}
// In app/Config/Routes.php
// to enable
$routes->setPrioritize();
// to disable
$routes->setPrioritize(false);
하나의 매개변수로서의 여러 URI 세그먼트
Added in version 4.5.0.
이 옵션을 활성화하면 (:any)처럼 여러 세그먼트와 일치하는 자리표시자는 여러 세그먼트를 포함하더라도 그대로 하나의 매개변수로 전달됩니다.
<?php
// In app/Config/Routing.php
use CodeIgniter\Config\Routing as BaseRouting;
class Routing extends BaseRouting
{
// ...
public bool $multipleSegmentsOneParam = true;
// ...
}
예를 들어 다음 라우트는
<?php
$routes->get('product/(:any)', 'Catalog::productLookup/$1');
그러면 product/123, product/123/456, product/123/456/789 등과 일치합니다. 그리고 URI가 product/123/456인 경우 123/456이 Catalog::productLookup() 메서드의 첫 번째 매개변수로 전달됩니다.
Auto Routing (Improved)
Added in version 4.2.0.
Auto Routing (Improved)는 더 안전한 새로운 자동 라우팅 시스템입니다.
자동 라우팅(향상)에 대한 자세한 내용은 해당 문서를 참조하십시오.
Auto Routing (Legacy)
중요
이 기능은 하위 호환성을 위해서만 존재합니다. 새 프로젝트에서는 사용하지 마십시오. 이미 사용 중이더라도 자동 라우팅(향상)를 사용하는 것이 좋습니다.
Auto Routing (Legacy)는 CodeIgniter 3의 라우팅 시스템입니다. 규칙에 따라 HTTP 요청을 자동으로 라우팅하고 해당 컨트롤러 메서드를 실행할 수 있습니다.
모든 라우트는 app/Config/Routes.php 파일에서 정의하거나 자동 라우팅(향상)를 사용하도록 권장합니다.
경고
설정 오류와 잘못된 코딩을 방지하려면 Auto Routing (Legacy) 기능을 사용하지 않는 것이 좋습니다. 컨트롤러 필터나 CSRF 보호가 우회되는 취약한 앱을 만들기 쉽기 때문입니다.
중요
Auto Routing (Legacy)는 모든 HTTP 메서드의 HTTP 요청을 컨트롤러 메서드로 라우팅합니다.
Auto Routing (Legacy) 활성화
v4.2.0부터 자동 라우팅은 기본적으로 비활성화되어 있습니다.
사용하려면 app/Config/Routing.php에서 $autoRoute 옵션을 true로 변경해야 합니다:
public bool $autoRoute = true;
그리고 app/Config/Feature.php에서 $autoRoutesImproved 속성을 false로 설정합니다:
public bool $autoRoutesImproved = false;
URI 세그먼트 (Legacy)
Model-View-Controller 접근 방식에서 URL의 세그먼트는 보통 다음을 나타냅니다:
example.com/class/method/ID
첫 번째 세그먼트는 호출되어야 하는 컨트롤러 클래스를 나타냅니다.
두 번째 세그먼트는 호출되어야 하는 클래스 메서드를 나타냅니다.
세 번째 및 그 이후의 세그먼트는 컨트롤러에 전달될 ID와 기타 변수를 나타냅니다.
다음 URI를 생각해 보십시오:
example.com/index.php/helloworld/index/1
위의 예에서 CodeIgniter는 Helloworld.php라는 컨트롤러를 찾고 index() 메서드를 실행하며 '1'을 첫 번째 인수로 전달하려고 시도합니다.
자세한 내용은 컨트롤러의 Auto Routing (Legacy)를 참조하십시오.
구성 옵션 (Legacy)
이 옵션들은 app/Config/Routing.php 파일에서 사용할 수 있습니다.
기본 컨트롤러 (Legacy)
사이트 루트 URI용 (Legacy)
사용자가 사이트의 루트(예: example.com)를 방문하면, 사용할 컨트롤러는 명시적으로 해당 라우트가 존재하지 않는 한 $defaultController 속성에 설정된 값으로 결정됩니다.
이 값의 기본값은 Home이며, app/Controllers/Home.php에 있는 컨트롤러와 일치합니다:
public string $defaultController = 'Home';
디렉터리 URI용 (Legacy)
일치하는 라우트를 찾지 못했을 때도 기본 컨트롤러가 사용되며, URI가 컨트롤러 디렉터리의 디렉터리를 가리키는 경우에도 사용됩니다. 예를 들어 사용자가 example.com/admin을 방문했을 때 app/Controllers/Admin/Home.php에 컨트롤러가 있으면 그것이 사용됩니다.
자세한 내용은 컨트롤러의 Auto Routing (Legacy)를 참조하십시오.
기본 메서드 (Legacy)
이는 기본 컨트롤러 설정과 비슷하게 동작하지만, URI와 일치하는 컨트롤러를 찾았으나 메서드에 해당하는 세그먼트가 없을 때 사용할 기본 메서드를 결정하는 데 사용됩니다. 기본값은 index입니다.
이 예에서 사용자가 example.com/products를 방문하고 Products 컨트롤러가 존재하면 Products::listAll() 메서드가 실행됩니다:
public string $defaultMethod = 'listAll';
라우트 확인
CodeIgniter에는 모든 라우트를 표시하는 다음 명령이 있습니다.
spark routes
모든 라우트와 필터를 표시합니다:
php spark routes
출력은 다음과 같습니다:
+---------+---------+---------------+-------------------------------+----------------+---------------+
| Method | Route | Name | Handler | Before Filters | After Filters |
+---------+---------+---------------+-------------------------------+----------------+---------------+
| GET | / | » | \App\Controllers\Home::index | | toolbar |
| GET | feed | » | (Closure) | | toolbar |
+---------+---------+---------------+-------------------------------+----------------+---------------+
Method 열은 해당 라우트가 수신 대기하는 HTTP 메서드를 보여줍니다.
Route 열은 일치시킬 라우트 경로를 보여줍니다. 정의된 라우트의 경로는 정규식으로 표현됩니다.
v4.3.0부터 Name 열은 라우트 이름을 표시합니다. »는 이름이 라우트 경로와 같음을 나타냅니다.
중요
시스템이 완벽하지는 않습니다. ([^/]+) 또는 {locale} 같은 정규식 패턴을 포함한 라우트의 경우, 표시되는 Filters*가 정확하지 않을 수 있으며(**app/Config/Filters.php*에서 필터에 대해 복잡한 URI 패턴을 설정한 경우), 또는 <unknown>으로 표시될 수 있습니다.
spark filter:check 명령을 사용하면 100% 정확한 필터를 확인할 수 있습니다.
Auto Routing (Improved)
Auto Routing (Improved)를 사용할 때 출력은 다음과 같습니다:
+-----------+-------------------------+---------------+-----------------------------------+----------------+---------------+
| Method | Route | Name | Handler | Before Filters | After Filters |
+-----------+-------------------------+---------------+-----------------------------------+----------------+---------------+
| GET(auto) | product/list/../..[/..] | | \App\Controllers\Product::getList | | toolbar |
+-----------+-------------------------+---------------+-----------------------------------+----------------+---------------+
Method는 GET(auto)와 같이 표시됩니다.
/..는 Route 열에서 하나의 세그먼트를 의미합니다. [/..]는 선택 사항임을 나타냅니다.
참고
auto-routing이 활성화되어 있고 home 라우트가 있으면 Home, hOme, hoMe, HOME 등으로도 접근할 수 있지만 명령은 home만 표시합니다.
다음과 같이 x로 시작하는 라우트가 보이면, 이는 라우팅되지 않는 잘못된 라우트이지만 컨트롤러에는 라우팅 가능한 public 메서드가 있음을 의미합니다.
+-----------+----------------+------+-------------------------------------+----------------+---------------+
| Method | Route | Name | Handler | Before Filters | After Filters |
+-----------+----------------+------+-------------------------------------+----------------+---------------+
| GET(auto) | x home/foo | | \App\Controllers\Home::getFoo | <unknown> | <unknown> |
+-----------+----------------+------+-------------------------------------+----------------+---------------+
위 예제는 \App\Controllers\Home::getFoo() 메서드가 있지만, 기본 컨트롤러(Home 기본값)이므로 라우팅되지 않았음을 보여줍니다. 기본 컨트롤러 이름은 URI에서 생략해야 합니다. getFoo() 메서드를 삭제해야 합니다.
참고
v4.3.4 이전에는 버그로 인해 잘못된 라우트가 일반 라우트로 표시되었습니다.
Auto Routing (Legacy)
Auto Routing (Legacy)를 사용할 때 출력은 다음과 같습니다:
+--------+--------------------+---------------+-----------------------------------+----------------+---------------+
| Method | Route | Name | Handler | Before Filters | After Filters |
+--------+--------------------+---------------+-----------------------------------+----------------+---------------+
| auto | product/list[/...] | | \App\Controllers\Product::getList | | toolbar |
+--------+--------------------+---------------+-----------------------------------+----------------+---------------+
Method는 auto입니다.
Route 열의 [/...]는 임의 개수의 세그먼트를 의미합니다.
참고
auto-routing이 활성화되어 있고 home 라우트가 있으면 Home, hOme, hoMe, HOME 등으로도 접근할 수 있지만 명령은 home만 표시합니다.
핸들러별 정렬
Added in version 4.3.0.
라우트를 handler 기준으로 정렬할 수 있습니다:
php spark routes --sort-by-handler
호스트 지정
Added in version 4.4.0.
요청 URL에서 호스트를 --host 옵션으로 지정할 수 있습니다:
php spark routes --host accounts.example.com
라우팅 정보 가져오기
CodeIgniter 4에서 라우팅 정보를 이해하고 관리하는 것은 HTTP 요청을 효과적으로 처리하는 데 중요합니다. 여기에는 활성 컨트롤러와 메서드, 그리고 특정 라우트에 적용된 필터의 세부 정보를 가져오는 작업이 포함됩니다. 아래에서는 로깅, 디버깅 또는 조건부 로직 구현 같은 작업을 지원하기 위해 이 라우팅 정보에 접근하는 방법을 살펴봅니다.
현재 컨트롤러/메서드 이름 가져오기
경우에 따라 현재 HTTP 요청에 의해 어떤 컨트롤러와 메서드가 호출되었는지 확인해야 할 수 있습니다. 이는 활성 컨트롤러 메서드를 기반으로 로깅, 디버깅 또는 조건부 로직을 수행할 때 유용합니다.
CodeIgniter 4는 Router 클래스를 사용하여 현재 라우트의 컨트롤러와 메서드 이름에 접근하는 간단한 방법을 제공합니다. 예:
<?php
// Get the router instance.
/** @var \CodeIgniter\Router\Router $router */
$router = service('router');
// Retrieve the fully qualified class name of the controller handling the current request.
$controller = $router->controllerName();
// Retrieve the method name being executed in the controller for the current request.
$method = $router->methodName();
echo 'Current Controller: ' . $controller . '<br>';
echo 'Current Method: ' . $method;
이 기능은 컨트롤러와 동적으로 상호작용해야 하거나 어떤 메서드가 특정 요청을 처리하는지 기록해야 할 때 특히 유용합니다.
현재 라우트의 활성 필터 가져오기
Filters는 HTTP 요청 처리 전후에 인증, 로깅, 보안 검사 같은 작업을 수행할 수 있게 해주는 강력한 기능입니다. 특정 라우트의 활성 필터에 접근하려면 Router 클래스의 CodeIgniterRouterRouter::getFilters() 메서드를 사용할 수 있습니다.
이 메서드는 처리 중인 라우트에 대해 현재 활성화된 필터 목록을 반환합니다:
<?php
// Get the router instance.
/** @var \CodeIgniter\Router\Router $router */
$router = service('router');
$filters = $router->getFilters();
echo 'Active Filters for the Route: ' . implode(', ', $filters);
참고
getFilters() 메서드는 특정 라우트에 정의된 필터만 반환합니다. 전역 필터나 app/Config/Filters.php 파일에 지정된 필터는 포함하지 않습니다.
현재 라우트의 일치한 라우트 옵션 가져오기
라우트를 정의할 때 filter, namespace, hostname, subdomain, offset, priority, as 같은 선택적 매개변수가 있을 수 있습니다. 이들은 모두 앞에서 설명했습니다. 또한 addRedirect()를 사용하면 redirect 키도 기대할 수 있습니다. 이러한 매개변수의 값을 가져오려면 Router::getMatchedRouteOptions()를 호출하면 됩니다. 반환되는 배열의 예는 다음과 같습니다:
<?php
// Get the router instance.
/** @var \CodeIgniter\Router\Router $router */
$router = service('router');
$options = $router->getMatchedRouteOptions();
echo 'Route name: ' . $options['as'];
print_r($options);
// Route name: api:auth
//
// Array
// (
// [filter] => api-auth
// [namespace] => App\API\v1
// [hostname] => example.com
// [subdomain] => api
// [offset] => 1
// [priority] => 1
// [as] => api:auth
// )