CI4 Playground v4.7.3
한국어문서
기본 규칙 + 커스텀 규칙 (korean_phone, not_reserved)

                                
테스트 케이스:
  • 사용자명에 admin 입력 → not_reserved 오류
  • 전화번호에 02-123-4567 입력 → korean_phone 오류
  • 올바른 값: honggil / 010-1234-5678 / 이메일
규칙 그룹 — 상품 등록 폼

                                
조건부 규칙 — permit_empty / if_exist

                                
테스트 케이스:
  • 닉네임/나이/웹사이트 비우고 제출 → 통과 (permit_empty)
  • 닉네임에 a 1자 입력 → 최소 2자 오류
  • 웹사이트에 example.com → URL 형식 오류
커스텀 규칙 클래스 작성
app/Validation/PlaygroundRules.php
namespace App\Validation;

class PlaygroundRules
{
    // 한국 전화번호 형식 검사 (010-XXXX-XXXX)
    public function korean_phone(string $value, string &$error = null): bool
    {
        if (preg_match('/^01[016789]-\d{3,4}-\d{4}$/', $value)) {
            return true;
        }
        $error = '올바른 한국 전화번호 형식이 아닙니다. (예: 010-1234-5678)';
        return false;
    }

    // 사용자명 금지어 체크
    // 사용법: not_reserved[admin,root,system]
    public function not_reserved(
        string $value,
        string $params,
        array $data,
        string &$error = null
    ): bool {
        $reserved = array_map('trim', explode(',', $params));
        if (in_array(strtolower($value), array_map('strtolower', $reserved))) {
            $error = '"' . $value . '"은(는) 사용할 수 없는 예약어입니다.';
            return false;
        }
        return true;
    }
}
Config/Validation.php — 규칙 클래스 등록
// app/Config/Validation.php
public array $ruleSets = [
    Rules::class,
    FormatRules::class,
    FileRules::class,
    CreditCardRules::class,
    \App\Validation\PlaygroundRules::class,  // 커스텀 규칙 추가
];
등록 후 컨트롤러에서 'rules' => 'required|korean_phone'처럼 바로 사용할 수 있습니다. 파라미터가 있는 규칙은 not_reserved[admin,root,system] 형식으로 전달합니다.
permit_empty
// 빈 값을 허용. 값이 있으면 나머지 규칙 적용
$rules = [
    'nickname' => 'permit_empty|min_length[2]|max_length[20]',
    'website'  => 'permit_empty|valid_url_strict',
];

// 빈 문자열('')로 제출 → 통과
// 값이 있으면 min_length, valid_url 검사 실행
permit_empty vs required:
required는 빈 값 거부.
permit_empty는 빈 값 허용, 값 있을 때만 검사.
if_exist
// 필드 자체가 POST 데이터에 없으면 검사 생략
// PUT/PATCH API에서 부분 업데이트 시 유용
$rules = [
    'age' => 'if_exist|integer|greater_than[0]',
];

// age 필드가 전송 안 됨 → 규칙 전체 생략
// age='' 로 전송 됨   → 정수 검사 실행
// age=25 로 전송 됨   → 통과
API 부분 업데이트:
PUT 요청에서 변경할 필드만 보낼 때 if_exist를 쓰면 없는 필드를 오류 처리하지 않습니다.
컨트롤러에서 규칙 배열 + 커스텀 에러 메시지
$rules = [
    'username' => [
        'label' => '사용자명',
        'rules' => 'required|min_length[3]|alpha_numeric|not_reserved[admin,root]',
        'errors' => [
            'required'      => '{field}은(는) 필수 입력 항목입니다.',
            'min_length'    => '{field}은(는) 최소 {param}자 이상이어야 합니다.',
            'alpha_numeric' => '{field}은(는) 영문자와 숫자만 허용됩니다.',
        ],
    ],
];

if ($this->validate($rules)) {
    // 통과
} else {
    $errors = $this->validator->getErrors();
    // ['username' => '오류 메시지', ...]
}