유효성 검사 고급
커스텀 규칙 클래스, 규칙 그룹, 조건부 규칙(permit_empty, if_exist)을 활용한 고급 유효성 검사를 학습합니다.
기본 규칙 + 커스텀 규칙 (korean_phone, not_reserved)
테스트 케이스:
- 사용자명에
admin입력 → not_reserved 오류 - 전화번호에
02-123-4567입력 → korean_phone 오류 - 올바른 값:
honggil/010-1234-5678/ 이메일
규칙 그룹 — 상품 등록 폼
조건부 규칙 — permit_empty / if_exist
테스트 케이스:
- 닉네임/나이/웹사이트 비우고 제출 → 통과 (permit_empty)
- 닉네임에
a1자 입력 → 최소 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 요청에서 변경할 필드만 보낼 때
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' => '오류 메시지', ...]
}