愚直なバリデーションが、
<?php
$isError = false;
if(!$isError && !isset($_GET['id']))
$_GET['id'] = 0;
if(!$isError && !is_numeric($_GET['id'])) {
$isError = true;
$error = 'ユーザ ID は整数です';
}
if(!$isError)
$_GET['id'] = intval($_GET['id']);
if(!$isError && !($_GET['id'] < 100)) {
$isError = true;
$error = 'ユーザ ID は100未満の整数です';
}
if(!$isError) {
$id = $_GET['id'];
// バリデーションに成功するときの処理
} else {
// バリデーションに失敗するときの処理
}
バリデータクラスだとこうなります。重複したり本質的ではないコードが減って、見通しが良くなります
<?php
$v = (new Validator)
->setDefault(0, 'set')
->setError('##は整数です', 'integer')
->set('intval')
->setError('##は100未満の整数です', '<', 100);
if($v->validate('get', 'id', 'ユーザ ID ')) {
$id = $v->get();
// バリデーションに成功するときの処理
} else {
$error = $v->getError();
// バリデーションに失敗するときの処理
}
Validator::setDefault
, Validator::setError
の第2引数には関数を渡すこともでき、複雑なバリデーションも可能です
<?php
$v = (new Validator)
->setError('##は奇数です', function($value) {
return $value % 2 === 1;
});
保守的に設計しましたが、保守的であることが初心者向けであるとは限らないので、意見をお伺いしたいです
Python
はインスタンスを作るのにnew
が入りません。PHP
でまねするとこうなります
<?php
class Validator {
public set() {}
}
function Validator {
return new Validator;
}
// ださい
(new Validator)->set();
// スマート
Validator()->set();
メソッド名のset
, get
はいらないでしょうか?
Validator::setError
よりもValidator::error
のほうが打ちやすいですしすっきりしますが、私は可読性が下がっている気がします
set
, integer
, <
, emailAddress
などのバリデーション案を共有しましょう!
setErrorメソッドでバリデートをかけてるんですか?
はい、バリデートをして駄目だったらエラーメッセージをセットしています
ただし、実際にバリデートが行われるのは
Varidator::validate
呼び出し時ですメソッドの役割がわかりずらい
Validator::setError
はバリデートをして駄目だったらエラーメッセージをセットValidator::setDefault
はバリデートをして駄目だったらデフォルト値を代入と一度に二つのことをしているのでわかりやすいメソッド名があったら教えてください!
set
,integer
などの文字列の意味がわからないset
値がsetされている(空ではない)integer
値が整数型であるemailAddress
値がEmail Addressに即している空を許さなければ
set
、整数じゃないと駄目ならinteger
みたいな イメージですこれも自由に変えられるのでいい命名があったら教えてください!
バリデート項目ありがとうございます!