我已经创建了一个验证程序,它接受规则对象来定义验证规则。
$rules['name1'] = [new NotEmpty(), new MaxChars(20), new Alpha(true)];
$rules['name2'] = [new MaxChars(20), new Alpha(true)];
我的验证器对这些规则对象的作用是,每当它尝试验证输入时,它将遍历每个规则对象并调用check()
方法以查看它是否有效。然后使用错误列表返回true或false。
$validator = new Validator();
$validator->setRule('name1', $rules['name1']); //void
$validator->setRule('name2', $rules['name2']); //void
$validator->validate('name1', 'John Doe'); //true
$validator->validate('name2', ''); //should return true, but returns false
什么是指示输入可选的好方法?
我有一个规则类NotEmpty
,但如果我将它从规则声明中删除,我的验证器仍然会循环并检查已声明的每个规则对象。虽然它应该忽略规则而只是return true
。这将是理想情景。
我考虑过将NotEmpty
课程与我的Validator
课程紧密结合,例如:检查它是否存在于规则数组中(这意味着是必需的还是可选的)。但是我宁愿让我的课程脱钩,我也不知道是否可能这样。
如果有人有好的建议,我可以自己执行进一步的实施。
答案 0 :(得分:2)
我会在$required
方法中添加setRule()
参数:
$validator->setRule('name1', $rules['name1'], $required = TRUE);
这是因为所有规则都会受到这个额外限制的影响,这意味着任何规则都需要该参数。
将参数放在setRule
中,您的验证码可能如下所示:
(伪代码,希望它是可以理解的):
if(!value_present($value)) {
if(!$rule->required) {
// no validation needed
return true;
} else {
throw Exception('...');
}
}
// Check constraints now. Constraint's code does not need to know
// about the $required anymore
foreach($rule->constraints as $c) {
$c->apply($value);
}
答案 1 :(得分:0)
这可能是想简单但是:
new MaxChars(20,optional = true)
或者从"可选"开始上课并设置一个标志。检查其他课程中的那个标志。