復習 - フォームバリデーター
CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 69/91。
チャレンジ
簡単最初の問題で停止するのではなく、バリデーションエラーを収集して一度に報告するユーザー登録フォームのバリデーターを構築しましょう。これは現実世界のフォームバリデーションの仕組みと同じです。ユーザーは、問題を1つずつ修正するのではなく、送信内容に関するすべての問題を確認したいと考えています。
コードを4つのファイルに分けて整理します:
ValidationException.php—Exceptionを継承するベースのValidationExceptionクラスを作成します。これは、すべてのバリデーション関連の例外の親として機能します。Exceptions.php— ValidationExceptionファイルを読み込み、ValidationExceptionを継承する3つの具体的な例外クラスを作成します:RequiredFieldException— コンストラクタでフィールド名を受け取り、メッセージ"[fieldName] is required"を親に渡しますInvalidEmailException— コンストラクタでメールアドレスの文字列を受け取り、メッセージ"'[email]' is not a valid email"を親に渡しますMinLengthException— コンストラクタでフィールド名と最小長(int)を受け取り、メッセージ"[fieldName] must be at least [minLength] characters"を親に渡します
FormValidator.php— Exceptionsファイルを読み込み、以下のバリデーションメソッドを持つFormValidatorクラスを作成します:validateRequired(?string $value, string $fieldName): string— 値がnullまたは空(トリミング後)の場合にRequiredFieldExceptionをスローし、それ以外の場合はトリミングされた値を返しますvalidateEmail(string $email): string— メールアドレスが無効な場合にInvalidEmailExceptionをスローし(filter_varとFILTER_VALIDATE_EMAILを使用)、それ以外の場合はメールアドレスを返しますvalidateMinLength(string $value, string $fieldName, int $minLength): string— 文字列の長さが最小長未満の場合にMinLengthExceptionをスローし、それ以外の場合は値を返します
main.php— FormValidatorファイルを読み込みます。ユーザー名、メールアドレス、パスワードの3つの入力を受け取ります。FormValidatorと、エラーメッセージを収集するための空の配列を作成します。各フィールドを個別のtry-catchブロックでバリデーションします:- ユーザー名が必須であることをバリデーションします
- メールアドレスが必須であることを最初にバリデーションし、次に有効なメール形式であることをバリデーションします
- パスワードが必須であることを最初にバリデーションし、次に最小長が8文字であることをバリデーションします
ValidationExceptionをキャッチしたときは、実行を停止するのではなく、そのメッセージをエラー配列に追加します。すべてのバリデーションの後、エラーがある場合は、各エラーメッセージをそれぞれの行に表示します。エラーがない場合は、
"Registration successful"と表示します。
報告する前にすべてのエラーを収集するこのパターンは、優れたユーザーエクスペリエンスのために不可欠です。例外の階層構造により、異なるバリデーション失敗に対して特定の例外タイプを持ちながら、単一の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ブロック内で、ユーザー名が必須であることをバリデートする
// ValidationExceptionをキャッチし、そのメッセージを$errors配列に追加する
// TODO: 最初にメールアドレスが必須であることをバリデートし、次に有効なメール形式であることをバリデートする
// try-catchブロックを使用し、エラーメッセージがあれば$errors配列に追加する
// TODO: 最初にパスワードが必須であることをバリデートし、次に最小長が8文字であることをバリデートする
// try-catchブロックを使用し、エラーメッセージがあれば$errors配列に追加する
// TODO: すべてのバリデーションの後:
// - エラーがある場合は、各エラーメッセージをそれぞれの行に出力する
// - エラーがない場合は、"Registration successful"と出力する
?>