
코드이그나이터4에서 컨트롤러는 브라우저를 비롯한 클라이언트의 요청(request)을 받아 응답(response)하는 역할을 하는 PHP 클래스입니다.
이번 장에서는 코드이그나이터4의 컨트롤러에 대해 개별 기능 사용법을 익혀 보겠습니다.
본 챕터의 내용은 github koenyeon ci4 sample_controller_create 브랜치 https://github.com/koeunyeon/ci4/tree/sample_controller_create 에서 확인하실 수 있습니다.
샘플 컨트롤러를 만들어 보겠습니다.
app/Controllers 디렉터리를 우클릭하고 new -> PHP Class를 선택합니다.
Sample이라고 입력한 후 OK 버튼을 누릅니다. 반드시 파일 첫번째 글자만 대문자로 적어야 합니다.
PHPStorm에서 파일을 Git에 추가할 것인지 물어봅니다. 파일 버전 관리를 위해 Add를 선택합니다.
이제 아래와 같이 Sample.php 파일이 생성됩니다.
/app/Controllers/Sample.php
<?php
namespace App\Controllers;
class Sample
{
}
아래와 같이 수정해 보겠습니다.
<?php
namespace App\Controllers; // (1)
class Sample extends BaseController // (2)
{
public function index(): string // (3) // (4)
{
return "Sample Controller"; // (5)
}
}
// (6)
코드를 설명하기 전 실행해 보겠습니다.
웹 서버가 켜져 있는지 확인합니다. 만약 실행되고 있지 않다면 Shift + F10 버튼을 누르거나 Run-> Run 'spark' 를 선택해서 웹 서버를 실행합니다.
http://localhost:8080/sample 주소에 브라우저로 접속해서 Sample Controller 메세지가 나오는지 확인하면 됩니다.

코드이그나이터4의 기본 URL 규칙은 꽤나 단순합니다. URL 자원의 경로(path)는 [/소문자 클래스 이름/메소드 이름]과 매핑시킵니다. 만약 메소드 이름이 생략된 채 소문자 클래스 이름만 경로로 주어진다면 메소드 이름이 index라고 가정합니다.
따라서 /sample 경로는 Sample 클래스의 index 메소드를 호출하게 됩니다.
이제 코드를 살펴보겠습니다.
(1) 네임스페이스를 파일 경로와 동일하게 App\Controllers로 설정합니다. 이 규칙은 모든 컨트롤러에 동일하게 적용됩니다.
namespace App\Controllers;
(2) BaseController 클래스를 상속한 Sample 클래스를 선언합니다.
class Sample extends BaseController
코드이그나이터4에서 컨트롤러 클래스의 이름은 반드시 대문자로 시작해야 하고 나머지는 모두 소문자입니다. 여러 단어로 이루어져 있다고 하더라도 대소문자가 섞인 Camel Case로 쓰면 안됩니다.
파일명은 클래스명과 동일해야 합니다.
(3) URL의 경로에 매핑되어 실행되는 함수 혹은 메소드를 엔드포인트(end point)라고 부릅니다. index() 메소드는 클래스가 가리키는 기본 엔드포인트가 됩니다.
public function index():
대부분의 객체지향 언어에서 클래스 안에 선언된 함수를 메소드라고 부릅니다. PHP도 마찬가지이므로 index() 함수도 메소드라고 부르겠습니다.
(4) PHP 7버전 이상부터는 함수에 리턴 타입을 선언할 수 있습니다. : string 부분이 바로 함수의 리턴 타입을 선언하는 부분입니다.
: string
다만 타입 선언이 강제는 아니고, 타입 선언을 하지 않을 경우 기존과 동일하게 리턴 타입에 구애받지 않습니다. 타입을 선언할 경우 선언된 타입과 다른 타입의 값이 반환되면 fatal error를 내 보내게 됩니다.
(5) "Sample Controller"라는 문자열을 리턴했습니다. 코드이그나이터4의 라우터는 리턴값을 받아서 웹 브라우저에 응답 문자열을 만들어냅니다.
return "Sample Controller";
(6) PSR-12(구버전-PSR2)에 따라 PHP code만 존재하는 파일에서는 닫는 태그(?>)를 생략합니다. 이는 닫는 태그 ?> 이후 공백이 있으면 출력에 영향이 있을 수도 있기 때문입니다.
컨트롤러의 기본 엔드포인트 외에 다른 엔드포인트를 정의하는 방법을 알아보겠습니다.
Sample 컨트롤러에 아래의 메소드를 추가합니다.
/app/Controllers/Sample.php
public function method(): string
{
return "run method";
}
http://localhost:8080/sample/method 접속해서 [/클래스 이름/메소드이름] 경로가 주어졌을 때 메소드가 잘 실행되는지 확인해 봅니다.

코드이그나이터가 좀 바뀐 것 같습니다 혹시 그대로 따라하고 404만 나오시는 분들은
http://ci4doc.cikorea.net/incoming/routing.html?highlight=getindex
이곳의 자동 라우팅 부분을 읽어보시고 활성화해주세요
그리고 자동 라우팅을 활성화했을 때는 앞으로 컨트롤러 클래스의 메소드 앞에 그 메소드에 해당하는 http 메소드(get/post 등)를 붙여주셔야 합니다
index(틀림)
getindex(맞음)
그럼 localhost:8080/sample으로 들어갔을때 잘 나올거예요
그리고 소문자로 getindex로 하든 대문자로 getIndex로 하든 둘 다 잘 나오네요