Menu
Coddy logo textTech

復習 - フォームバリデーター

CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 69/91。

challenge icon

チャレンジ

簡単

最初の問題で処理を停止するのではなく、検証エラーを収集して一度にすべて報告するユーザー登録フォームのバリデーターを作成しましょう。これは実際のフォーム検証の仕組みです。ユーザーは問題を一つずつ修正するのではなく、送信内容に含まれるすべての問題を確認したいと考えます。

コードを4つのファイルに分けて整理します。

  • ValidationException.phpExceptionをextendsする基底ValidationException classをCreateします。これは、検証関連のすべての例外の親になります。
  • Exceptions.php:ValidationExceptionファイルを含め、ValidationExceptionをextendsする3つの具体的な例外classをCreateします。
    • RequiredFieldException:constructorでfield nameをAcceptsし、メッセージ"[fieldName] is required"を親に渡します
    • InvalidEmailException:constructorでemail stringをAcceptsし、メッセージ"'[email]' is not a valid email"を親に渡します
    • MinLengthException:constructorでfield nameと最小length(int)をAcceptsし、メッセージ"[fieldName] must be at least [minLength] characters"を親に渡します
  • FormValidator.php:Exceptionsファイルを含め、次の検証methodを持つFormValidator classをCreateします。
    • validateRequired(?string $value, string $fieldName): string:valueがnullまたはempty(trim後)の場合はRequiredFieldExceptionをthrowし、それ以外の場合はtrim済みのvalueをreturnします
    • validateEmail(string $email): string:emailがinvalidの場合はInvalidEmailExceptionをthrowします(filter_varFILTER_VALIDATE_EMAILを使用)。それ以外の場合はemailをreturnします
    • validateMinLength(string $value, string $fieldName, int $minLength): string:stringのlengthが最小値lessの場合はMinLengthExceptionをthrowし、それ以外の場合はvalueをreturnします
  • main.php:FormValidatorファイルを含めます。username、email、passwordの3つのinputを受け取ります。

    FormValidatorと、error messageをcollectするためのempty arrayをCreateします。各fieldを個別のtry-catch blockで検証します。

    • usernameをrequiredとして検証する
    • emailをfirstにrequiredとして検証し、その後validなemail formatとして検証する
    • passwordをfirstにrequiredとして検証し、その後lengthが8 charactersのleastであることを検証する

    ValidationExceptionをcatchしたときは、実行を停止するのではなく、そのmessageをerrors arrayにaddします。

    すべての検証のafter、errorsがある場合は各error messageをそれぞれ独自のlineにprintします。errorsがない場合は"Registration successful"をprintします。

すべてのerrorsを報告するbeforeにcollectするこのパターンは、優れたユーザー体験に不可欠です。例外の階層により、異なる検証失敗に対するspecificな例外typeを保持しながら、単一のcatch blockですべての検証問題を簡単にcatchできます。

自分で試してみよう

<?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: すべての検証の後:
// - エラーがある場合は、各エラーメッセージをそれぞれ1行に出力する
// - If there are no errors, print "Registration successful"

?>

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: PHPオンラインコンパイラ