라우팅
URL과 컨트롤러 메서드를 연결하는 CI4의 라우팅 시스템을 알아봅니다.
1
기본 라우팅 — GET / POST
가장 기본적인 형태로, HTTP 메서드와 URL을 컨트롤러 메서드에 매핑합니다.
app/Config/Routes.php
// GET 요청: 홈 페이지
$routes->get('/', 'Home::index');
// POST 요청: 데이터 저장
$routes->post('examples/controllers/store', 'Examples\Controllers::store');
// GET + POST 동시 처리
$routes->match(['get', 'post'], 'examples/routing/method', 'Examples\Routing::method');
2
URL 파라미터
URL에서 값을 추출해 컨트롤러에 전달합니다. (:num), (:alpha), (:segment) 등의 플레이스홀더를 사용합니다.
app/Config/Routes.php
// (:num) — 숫자만 허용
$routes->get('examples/routing/params/(:num)', 'Examples\Routing::params/$1');
// (:alpha) — 영문자만 허용
// (:alphanum) — 영문자+숫자
// (:segment) — / 를 제외한 모든 문자
// (:any) — 모든 문자 (슬래시 포함)
app/Controllers/Examples/Routing.php
public function params(int $id): string
{
return view('examples/routing/params', ['id' => $id]);
}
3
Named Route (이름 있는 라우트)
라우트에 이름을 붙이면 URL이 변경되어도 코드를 수정할 필요 없이 route_to()로 URL을 생성할 수 있습니다.
app/Config/Routes.php
$routes->get('examples/routing/named', 'Examples\Routing::named', ['as' => 'routing.named']);
컨트롤러 / 뷰에서 사용
// 컨트롤러에서
$url = route_to('routing.named'); // → /examples/routing/named
// 뷰에서
echo anchor(route_to('routing.named'), '이동하기');
4
라우트 그룹
관련된 라우트를 그룹으로 묶어 공통 접두사, 네임스페이스, 필터를 한 번에 적용할 수 있습니다.
app/Config/Routes.php
// 이 프로젝트의 모든 예제 라우트는 'examples' 그룹으로 관리됩니다
$routes->group('examples', ['namespace' => 'App\Controllers\Examples'], function ($routes) {
$routes->get('routing', 'Routing::index');
$routes->get('controllers', 'Controllers::index');
$routes->get('models', 'Models::index');
// ...
});
// 필터 적용 예시
$routes->group('admin', ['filter' => 'auth'], function ($routes) {
$routes->get('dashboard', 'Admin::dashboard');
$routes->get('users', 'Admin::users');
});
5
리다이렉트
컨트롤러에서 다른 URL로 리다이렉트하거나, 라우트 자체에 리다이렉트를 설정할 수 있습니다.
컨트롤러에서 리다이렉트
// URL로 리다이렉트
return redirect()->to(base_url('examples/routing/redirected'));
// Named Route로 리다이렉트
return redirect()->route('routing.named');
// 이전 페이지로 돌아가기
return redirect()->back()->with('message', '처리 완료!');
// 라우트 설정에서 바로 리다이렉트
$routes->addRedirect('old-path', 'new-path', 301);