자동 라우팅(향상)
Added in version 4.2.0.
자동 라우팅(향상)이란?
기본적으로 모든 라우트는 구성 파일에 defined 되어 있어야 합니다.
그러나 자동 라우팅(향상)을 사용하면 컨트롤러 이름과 메서드 이름을 규약에 따라 정의하면 자동으로 라우팅됩니다. 즉, 라우트를 수동으로 정의할 필요가 없습니다.
자동 라우팅(향상)을 활성화하면, URI와 일치하는 정의된 라우트가 없는 경우 시스템이 해당 URI를 컨트롤러와 메서드에 대해 매칭하려 시도합니다.
중요
보안상의 이유로 정의된 라우트에서 컨트롤러가 사용되는 경우 자동 라우팅(향상)이 컨트롤러로 라우팅되지 않습니다.
참고
자동 라우팅(향상)은 기본적으로 비활성화되어 있습니다. 사용하려면 자동 라우팅(향상) 활성화을 참조하세요.
레거시 자동 라우팅과의 차이점
Auto Routing (Legacy)은 CodeIgniter 3의 라우팅 시스템입니다. 익숙하지 않다면 다음 섹션으로 이동하세요.
잘 아시는 분들은 자동 라우팅(향상)에서 다음과 같은 몇 가지 변경 사항을 확인하실 수 있습니다.
- 컨트롤러 메서드에는
getIndex(),postCreate()과 같은 HTTP 동사 접두사가 필요합니다. 개발자는 항상 HTTP 메서드를 알고 있으므로 예상치 못한 HTTP 메서드가 포함된 요청은 컨트롤러를 실행하지 않습니다.
- 컨트롤러 메서드에는
- 기본 컨트롤러(기본적으로
Home)와 기본 메서드(기본적으로index)는 URI에서 생략되어야 합니다. 컨트롤러 메서드와 URI 간의 일대일 대응을 제한합니다.
예: 기본적으로
/에 접근할 수 있지만/home및/home/index은 404 Not Found가 됩니다.
- 기본 컨트롤러(기본적으로
- 메서드 매개변수 개수를 확인합니다.
URI에 메서드 매개 변수보다 더 많은 매개 변수가 있는 경우 404 찾을 수 없음이 발생합니다.
_remap()메서드를 지원하지 않습니다.컨트롤러 메서드와 URI 간의 일대일 대응을 제한합니다.
하지만 대신 기본 메서드 폴백 기능이 있습니다.
- 정의된 라우트의 컨트롤러에 접근할 수 없습니다.
자동 라우팅을 통해 접근할 수 있는 컨트롤러와 정의된 라우트를 통해 접근할 수 있는 컨트롤러를 완전히 분리합니다.
자동 라우팅(향상) 활성화
이를 사용하려면 app/Config/Routing.php에서 $autoRoute 옵션 설정을 true로 변경해야 합니다:
public bool $autoRoute = true;
그리고 app/Config/Feature.php에서 $autoRoutesImproved 속성을 true로 변경해야 합니다:
public bool $autoRoutesImproved = true;
중요
자동 라우팅(향상)을 사용하는 경우 app/Config/Routes.php에서 $routes->get('/', 'Home::index'); 줄을 제거해야 합니다. 정의된 라우트는 자동 라우팅보다 우선하며 정의된 라우트에 정의된 컨트롤러는 보안상의 이유로 자동 라우팅(향상)에 의해 접근가 거부되기 때문입니다.
URI 세그먼트
Model-View-Controller 접근 방식을 따르는 URL의 세그먼트는 일반적으로 다음을 나타냅니다:
http://example.com/{class}/{method}/{param1}
첫 번째 세그먼트는 호출되어야 하는 컨트롤러 클래스를 나타냅니다.
두 번째 세그먼트는 호출되어야 하는 클래스 메서드를 나타냅니다.
세 번째 세그먼트와 추가 세그먼트는 컨트롤러 메서드에 전달될 매개변수를 나타냅니다.
다음 URI를 고려하세요:
http://example.com/hello-world/hello/1
위의 예에서 GET 메서드를 사용하여 HTTP 요청을 보내면 자동 라우팅(향상)은 App\Controllers\HelloWorld이라는 컨트롤러를 찾으려고 시도하고 '1'을 첫 번째 매개 변수로 전달하여 getHello() 메서드를 실행합니다.
참고
자동 라우팅(향상)으로 실행되는 컨트롤러 메서드에는 getIndex(), postCreate()와 같은 HTTP 동사(get, post, put 등) 접두사가 필요합니다.
참고
컨트롤러의 짧은 이름이 URI의 첫 번째 세그먼트와 일치하면 로드됩니다.
실제로 해봅시다: Hello World!
실제로 작동하는 모습을 볼 수 있도록 간단한 컨트롤러를 만들어 보겠습니다.
컨트롤러 만들기
텍스트 편집기를 사용하여 app/Controllers 디렉터리에 HelloWorld.php라는 파일을 만들고 그 안에 다음 코드를 입력합니다.
<?php
namespace App\Controllers;
class HelloWorld extends BaseController
{
public function getIndex()
{
return 'Hello World!';
}
}
중요
파일 이름은 HelloWorld.php여야 합니다. 자동 라우팅(향상)을 사용하는 경우 컨트롤러 클래스 이름은 CamelCase여야 합니다.
HelloWorld 컨트롤러가 BaseController을 확장하고 있음을 알 수 있습니다. BaseController의 기능이 필요하지 않은 경우 CodeIgniter\Controller을 확장할 수도 있습니다.
BaseController는 구성 요소를 로드하고 모든 컨트롤러에 필요한 기능을 수행하기 위한 편리한 장소를 제공합니다. 새로운 컨트롤러에서 이 클래스를 확장할 수 있습니다.
중요
자동 라우팅(향상)으로 실행되는 컨트롤러 메서드에는 getIndex(), postCreate()와 같은 HTTP 동사(get, post, put 등) 접두사가 필요합니다.
라우트 확인
spark routes 명령을 사용하여 라우트를 확인할 수 있습니다.
php spark routes
올바르게 수행했다면 다음과 같이 표시되어야 합니다.
+-----------+-------------+------+---------------------------------------+----------------+---------------+
| Method | Route | Name | Handler | Before Filters | After Filters |
+-----------+-------------+------+---------------------------------------+----------------+---------------+
| GET(auto) | hello-world | | \App\Controllers\HelloWorld::getIndex | | |
+-----------+-------------+------+---------------------------------------+----------------+---------------+
출력 세부정보는 spark routes을 참조하세요.
사이트 방문
이제 다음과 유사한 URL을 사용하여 사이트를 방문하십시오:
http://example.com/hello-world
시스템은 대시(-)가 포함된 URI를 컨트롤러 및 메서드 URI 세그먼트의 CamelCase로 자동 변환합니다.
예를 들어, URI sub-dir/hello-controller/some-method은 SubDir\HelloController::getSomeMethod() 메서드를 실행합니다.
올바르게 수행했다면 다음과 같이 표시됩니다:
Hello World!
컨트롤러 이름 예시
다음은 유효한 컨트롤러 이름입니다. App\Controllers\HelloWorld은 CamelCase이기 때문입니다.
<?php
namespace App\Controllers;
class HelloWorld extends BaseController
{
// ...
}
다음은 유효하지 않습니다. 첫 글자(h)는 대문자가 아니기 때문입니다.
<?php
namespace App\Controllers;
class helloworld extends BaseController
{
// ...
}
다음도 유효하지 않습니다. 첫 글자(h)는 대문자가 아니기 때문입니다.
<?php
namespace App\Controllers;
class helloWorld extends BaseController
{
// ...
}
컨트롤러 메서드
메서드 가시성
HTTP 요청을 통해 실행 가능한 메서드를 정의하는 경우 해당 메서드를 public로 선언해야 합니다.
경고
보안상의 이유로 새 유틸리티 메서드를 protected 또는 private로 선언해야 합니다.
기본 메서드
위의 예에서 메서드 이름은 getIndex()입니다. 메서드(HTTP 동사 + Index())를 기본 메서드라고 하며, URI의 두 번째 세그먼트가 비어 있는 경우 로드됩니다.
일반 메서드
URI의 두 번째 세그먼트는 컨트롤러의 어떤 메서드가 호출되는지 결정합니다.
시도해 봅시다. 컨트롤러에 새 메서드를 추가합니다.
<?php
namespace App\Controllers;
class HelloWorld extends BaseController
{
public function getIndex()
{
return 'Hello World!';
}
public function getComment()
{
return 'I am not flat!';
}
}
이제 다음 URL을 로드하여 getComment() 메서드를 확인하세요.:
http://example.com/hello-world/comment/
새 메시지가 표시됩니다.
URI 세그먼트를 메서드에 전달하기
URI에 세 개 이상의 세그먼트가 포함되어 있으면 해당 세그먼트가 매개변수로 메서드에 전달됩니다.
예를 들어 다음과 같은 URI가 있다고 가정해 보겠습니다:
http://example.com/products/shoes/sandals/123
귀하의 메서드는 URI 세그먼트 3과 4('sandals' 및 '123')로 전달됩니다.
<?php
namespace App\Controllers;
class Products extends BaseController
{
public function getShoes($type, $id)
{
return $type . $id;
}
}
참고
메서드 매개 변수보다 URI에 매개 변수가 더 많은 경우 자동 라우팅(향상)이 메서드를 실행하지 않고 404 찾을 수 없음이 발생합니다.
기본 컨트롤러
기본 컨트롤러는 사이트 루트 URL만 요청하는 경우처럼 URI가 디렉터리 이름으로 끝나거나 URI가 없을 때 사용되는 특수 컨트롤러입니다.
기본적으로 기본 컨트롤러는 Home입니다.
참고
기본 컨트롤러에서는 기본 메서드(GET 요청의 경우 getIndex())만 정의합니다. 다른 공개 메서드를 정의하면 해당 메서드는 실행되지 않습니다.
자세한 내용은 설정 옵션을 참조하세요.
기본 메서드 폴백
Added in version 4.4.0.
메서드 이름의 URI 세그먼트에 해당하는 컨트롤러 메서드가 존재하지 않는 경우 기본 메서드가 정의되어 있으면 나머지 URI 세그먼트를 기본 메서드에 전달하여 실행합니다.
<?php
namespace App\Controllers;
class Product extends BaseController
{
public function getIndex($id = null, $action = '')
{
// ...
}
}
다음 URL을 로드합니다:
http://example.com/product/15/edit
이 메서드는 URI 세그먼트 2와 3('15' 및 'edit')으로 전달됩니다.
중요
메서드 매개 변수보다 URI에 매개 변수가 더 많은 경우 자동 라우팅(향상)이 메서드를 실행하지 않고 404 찾을 수 없음이 발생합니다.
기본 컨트롤러로 폴백
컨트롤러 이름의 URI 세그먼트에 해당하는 컨트롤러가 존재하지 않고 디렉터리에 기본 컨트롤러(기본적으로 Home)가 있는 경우 나머지 URI 세그먼트는 기본 컨트롤러의 기본 메서드에 전달됩니다.
예를 들어, app/Controllers/News 디렉터리에 다음과 같은 기본 컨트롤러 Home이 있는 경우:
<?php
namespace App\Controllers\News;
use App\Controllers\BaseController;
class Home extends BaseController
{
public function getIndex($id = null)
{
// ...
}
}
다음 URL을 로드합니다:
http://example.com/news/101
News\Home 컨트롤러와 기본 getIndex() 메서드가 발견됩니다. 따라서 기본 메서드는 두 번째 URI 세그먼트('101')를 가져옵니다.
참고
App\Controllers\News 컨트롤러가 있으면 해당 컨트롤러가 우선적으로 적용됩니다. URI 세그먼트는 순차적으로 검색되며 발견된 첫 번째 컨트롤러가 사용됩니다.
참고
메서드 매개 변수보다 URI에 매개 변수가 더 많은 경우 자동 라우팅(향상)이 메서드를 실행하지 않고 404 찾을 수 없음이 발생합니다.
컨트롤러를 하위 디렉터리로 구성하기
대규모 애플리케이션을 구축하는 경우 컨트롤러를 하위 디렉터리로 계층적으로 구성하거나 구성할 수 있습니다. CodeIgniter를 사용하면 이를 수행할 수 있습니다.
기본 app/Controllers 아래에 하위 디렉터리를 만들고 그 안에 컨트롤러 클래스를 배치하기만 하면 됩니다.
중요
디렉토리 이름은 대문자로 시작해야 하며 CamelCase여야 합니다.
이 기능을 사용할 때 URI의 첫 번째 세그먼트는 디렉터리를 지정해야 합니다. 예를 들어, 다음 위치에 컨트롤러가 있다고 가정해 보겠습니다:
app/Controllers/Products/Shoes.php
위 컨트롤러를 호출하기 위한 URI는 다음과 같습니다:
http://example.com/products/shoes/show/123
참고
app/Controllers 및 public에는 동일한 이름의 디렉터리가 있을 수 없습니다. 디렉토리가 있으면 웹 서버가 이를 검색하고 CodeIgniter로 라우팅되지 않기 때문입니다.
각 하위 디렉터리에는 URL에 하위 디렉터리만 만 포함되어 있는 경우 호출되는 기본 컨트롤러가 포함될 수 있습니다. app/Config/Routing.php 파일에 지정된 기본 컨트롤러 이름과 일치하는 컨트롤러를 거기에 넣기만 하면 됩니다.
컨트롤러/메서드와 URI 예시
기본 구성을 사용하는 GET 요청의 경우 컨트롤러/메서드와 URI 간의 매핑은 다음과 같습니다.
컨트롤러/메서드 |
URI |
설명 |
|---|---|---|
|
/ |
기본 컨트롤러와 기본 메서드. |
|
/블로그 |
기본 방법. |
|
/사용자 프로필 |
기본 방법. |
|
/블로그/태그 |
|
|
/블로그/뉴스/123 |
|
|
/블로그 |
하위 디렉터리 |
|
/블로그/태그 |
하위 디렉터리 |
|
/블로그/뉴스/123 |
하위 디렉터리 |
필터 적용
컨트롤러 필터를 적용하면 컨트롤러 메서드 실행 전후에 처리를 추가할 수 있습니다. 이는 인증이나 API 로깅 중에 특히 유용합니다.
자동 라우팅을 사용하는 경우 app/Config/Filters.php에서 적용할 필터를 설정하세요. 필터 설정에 대한 자세한 내용은 Controller Filters을 참조하세요.
설정 옵션
이러한 옵션은 app/Config/Routing.php 파일에서 사용할 수 있습니다.
기본 컨트롤러
사이트 루트 URI의 경우
사용자가 사이트의 루트(예: http://example.com)를 방문할 때 사용할 컨트롤러는 해당 라우트가 명시적으로 존재하지 않는 한 $defaultController 속성에 설정된 값에 따라 결정됩니다.
이에 대한 기본값은 app/Controllers/Home.php의 컨트롤러와 일치하는 Home입니다:
public string $defaultController = 'Home';
디렉터리 URI의 경우
기본 컨트롤러는 일치하는 라우트가 발견되지 않은 경우에도 사용되며 URI는 컨트롤러 디렉터리의 디렉터리를 가리킵니다. 예를 들어, 사용자가 http://example.com/admin을 방문하는 경우 app/Controllers/Admin/Home.php에서 컨트롤러를 찾았다면 해당 컨트롤러가 사용됩니다.
중요
컨트롤러 이름의 URI로는 기본 컨트롤러에 접근할 수 없습니다. 기본 컨트롤러가 Home일 경우 http://example.com/에 접근할 수 있지만, http://example.com/home에 접근하면 찾을 수 없습니다.
기본 메서드
이는 기본 컨트롤러 설정과 유사하게 작동하지만 URI와 일치하는 컨트롤러가 발견되었지만 메서드에 대한 세그먼트가 없을 때 사용되는 기본 메서드를 결정하는 데 사용됩니다. 기본값은 index입니다.
이 예에서 사용자가 example.com/products를 방문하고 Products 컨트롤러가 존재하는 경우 Products::getListAll() 메서드가 실행됩니다:
public string $defaultMethod = 'listAll';
중요
기본 메서드 이름의 URI로는 컨트롤러에 접근할 수 없습니다. 위 예시에서는 example.com/products에 접근할 수 있지만, example.com/products/listall에 접근하면 찾을 수 없습니다.
URI를 CamelCase로 변환
Added in version 4.5.0.
참고
v4.6.0부터 $translateUriToCamelCase 옵션이 기본적으로 활성화되어 있습니다.
v4.5.0부터 현재 CodeIgniter의 코딩 표준에 잘 맞는 $translateUriToCamelCase 옵션이 구현되었습니다.
이 옵션을 사용하면 컨트롤러 및 메서드 URI 세그먼트에서 대시(-)가 포함된 URI를 CamelCase로 자동 변환할 수 있습니다.
예를 들어, URI sub-dir/hello-controller/some-method은 SubDir\HelloController::getSomeMethod() 메서드를 실행합니다.
참고
이 옵션이 활성화되면 $translateURIDashes 옵션이 무시됩니다.
URI를 CamelCase로 변환 비활성화
참고
“URI를 CamelCase로 변환”을 비활성화하는 옵션은 이전 버전과의 호환성을 위해서만 존재합니다. 비활성화하지 않는 것이 좋습니다.
이를 비활성화하려면 app/Config/Routing.php에서 $translateUriToCamelCase 옵션 설정을 false로 변경해야 합니다:
public bool $translateUriToCamelCase = false;
모듈 라우팅
Added in version 4.4.0.
코드 모듈을 사용하고 컨트롤러를 다른 네임스페이스에 배치하는 경우에도 자동 라우팅을 사용할 수 있습니다.
모듈로 라우팅하려면 app/Config/Routing.php의 $moduleRoutes 속성을 설정해야 합니다:
public array $moduleRoutes = [
'blog' => 'Acme\Blog\Controllers',
];
키는 모듈의 첫 번째 URI 세그먼트이고 값은 컨트롤러 네임스페이스입니다. 위 구성에서 http://localhost:8080/blog/foo/bar는 Acme\Blog\Controllers\Foo::getBar()로 라우팅됩니다.
참고
$moduleRoutes을 정의하면 모듈의 라우팅이 우선적으로 적용됩니다. 위의 예에서 App\Controllers\Blog 컨트롤러가 있더라도 http://localhost:8080/blog는 기본 컨트롤러 Acme\Blog\Controllers\Home로 라우팅됩니다.