Menu
Coddy logo textTech

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

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

challenge icon

チャレンジ

簡単

最初の問題で停止するのではなく、バリデーションエラーを収集して一度に報告するユーザー登録フォームのバリデーターを構築しましょう。これは現実世界のフォームバリデーションの仕組みと同じです。ユーザーは、問題を1つずつ修正するのではなく、送信内容に関するすべての問題を確認したいと考えています。

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

  • ValidationException.phpExceptionを継承するベースの 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_varFILTER_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"と出力する

?>

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