私が過去に行った方法は、オブジェクトを作成することでした...フォームオブジェクト、フォームフィールドオブジェクト、フォームフィールドバリデーターオブジェクトです。
したがって、すべてのフィールド オブジェクトを作成し、必要に応じてバリデーターをそれらにアタッチしてから、フォーム全体をフォームにアタッチします。つまり、次のような結果になります。
$oFieldUsername = new FormField('username', new Validator(Validator::TYPE_EMAIL));
$oFieldPassword = new FormField('password', new Validator(Validator::TYPE_PASSWORD));
$oForm = new Form(Form::METHOD_POST, '/path/to/action.php');
$oForm->attachField($oFieldUsername);
$oForm->attachField($oFieldPassword);
//form has not been posted
if(!$oForm->isReceived()) {
$oForm->render('/path/to/view.tpl.php');
}
//the form HAS been posted but IS NOT VALID
elseif(!$oForm->isValid()) {
$oForm->render('/path/to/view.tpl.php');
}
//the form HAS been posted and the data LOOKS valid
else {
//do processing and hand-off
}
バリデーターは、フィールド データが必要かどうかを判断するなどの処理を行います。たとえば、データが空の文字列 (RegExp) と一致する場合は必要ありません。
しかし、それらは電子メールの検証 (getmxrr() ルックアップの有無にかかわらず) などを処理することもできます。特定のケースに合わせて Validator タイプを構築するだけです... または、一般的な Validators があります。
new Validator(Validator::TYPE_EMAIL); //basic email validator
new Validator(Validator::TYPE_EMAIL_WITH_MX); //email validator with getmxrr()
new Validator(Validator::TYPE_REGEXP, '/^[\w]+$/'); //generic regular expression with the pattern to match as the second parameter
new Validator(Validator::TYPE_INT_MIN, 10); //integer with a minimum value of 10
new Validator(Validator::TYPE_REGEXP, '/^[\w\s]*$/', true); //the third parameter could be an override so that the validation is optional - if the field has a value it MUST validate, if it doesn't have a value, it's fine
これにより、検証に必要なだけの柔軟性が得られます。メソッドはすべてForm::isValid()
のアタッチされたフィールドをループし、バリデーターがあるかどうかを確認し、ある場合はValidator::isValid()
メソッドが true を返すかどうかを確認します。
次のような方法で、複数のバリデーターをフィールドにアタッチすることもできます。
//the field value must be an integer between 5 and 10 (inclusive)
$oField->addValidator(new Validator(Validator::TYPE_INT_MIN, 5));
$oField->addValidator(new Validator(Validator::TYPE_INT_MAX, 10));
・・・とにかくそうしました。