愚直なバリデーションが、
<?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メソッドでバリデートをかけてるんですか?
ぱっと見な印象としては、ちょっとメソッドの役割がわかりづらいかなーと感じました。
'set', 'interger' , 'intval', などの文字列がどういった意味をもつのかがわからなかったです。
バリデート項目
くらいしか思い浮かばないです。