Menu
Coddy logo textTech

복습 - 폼 검증기

Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 91개 중 69번째.

challenge icon

챌린지

쉬움

첫 번째 문제에서 멈추는 대신 유효성 검사 오류를 수집하고 한 번에 모두 보고하는 사용자 등록 양식 유효성 검사기를 만들어 보겠습니다. 이것이 실제 환경에서 양식 유효성 검사가 작동하는 방식입니다. 사용자는 제출한 내용의 모든 문제를 확인하고, 한 번에 하나씩 수정하기를 원하지 않습니다.

코드를 네 개의 파일로 구성합니다:

  • ValidationException.php: Exception을 확장하는 기본 ValidationException class를 Create합니다. 이 class는 유효성 검사와 관련된 모든 예외의 부모 역할을 합니다.
  • Exceptions.php: ValidationException 파일을 포함하고 ValidationException을 확장하는 세 가지 구체적인 예외 class를 Create합니다:
    • RequiredFieldException: constructor에서 field 이름을 Accepts하고 "[fieldName] is required" 메시지를 부모에게 전달합니다.
    • InvalidEmailException: constructor에서 email 문자열을 Accepts하고 "'[email]' is not a valid email" 메시지를 부모에게 전달합니다.
    • MinLengthException: constructor에서 field 이름과 최소 길이(int)를 Accepts하고 "[fieldName] must be at least [minLength] characters" 메시지를 부모에게 전달합니다.
  • FormValidator.php: Exceptions 파일을 포함하고 다음 유효성 검사 메서드를 갖는 FormValidator class를 Create합니다:
    • validateRequired(?string $value, string $fieldName): string: 값이 null이거나 비어 있으면(trim 후) RequiredFieldException을 발생시키고, 그렇지 않으면 trim된 값을 반환합니다.
    • validateEmail(string $email): string: email이 유효하지 않으면 InvalidEmailException을 발생시킵니다(FILTER_VALIDATE_EMAIL과 함께 filter_var를 사용). 그렇지 않으면 email을 반환합니다.
    • validateMinLength(string $value, string $fieldName, int $minLength): string: 문자열 길이가 최소 길이보다 less하면 MinLengthException을 발생시키고, 그렇지 않으면 값을 반환합니다.
  • main.php: FormValidator 파일을 포함합니다. username, email, password라는 세 가지 inputs를 받습니다.

    FormValidator와 오류 메시지를 collect할 empty array를 Create합니다. 각 field를 별도의 try-catch block에서 검증합니다:

    • username을 required로 검증합니다.
    • email을 먼저 required로 검증한 다음, 유효한 email format인지 검증합니다.
    • password를 먼저 required로 검증한 다음, 최소 8 characters인지 검증합니다.

    ValidationException을 catch할 때 실행을 중단하는 대신 해당 메시지를 errors array에 추가합니다.

    모든 유효성 검사가 끝난 후 errors가 있으면 각 오류 메시지를 자체 line에 print합니다. errors가 없으면 "Registration successful"을 print합니다.

모든 오류를 보고하기 전에 collect하는 이 pattern은 좋은 사용자 경험을 위해 essential합니다. exception hierarchy를 사용하면 단일 catch block으로 모든 유효성 검사 문제를 쉽게 catch하면서도 서로 다른 유효성 검사 실패에 대해 specific exception types를 유지할 수 있습니다.

직접 해보기

<?php
require_once 'FormValidator.php';

// 입력 읽기
$username = trim(fgets(STDIN));
$email = trim(fgets(STDIN));
$password = trim(fgets(STDIN));

// FormValidator 인스턴스 생성
$validator = new FormValidator();

// 오류 메시지를 수집할 빈 배열 생성
$errors = [];

// TODO: try-catch 블록에서 username을 필수로 검증
// ValidationException을 잡고 그 메시지를 $errors 배열에 추가

// TODO: 먼저 email을 필수로 검증한 다음, 유효한 이메일 형식으로 검증
// try-catch 블록을 사용하고 오류 메시지를 $errors 배열에 추가

// TODO: 먼저 password를 필수로 검증한 다음, 최소 길이 8자로 검증
// try-catch 블록을 사용하고 오류 메시지를 $errors 배열에 추가

// TODO: 모든 검증 후:
// - 오류가 있으면 각 오류 메시지를 한 줄에 출력
// - If there are no errors, print "Registration successful"

?>

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 PHP 컴파일러