在我的验证器中实现可选输入

时间:2014-06-21 11:41:07

标签: php validation

我已经创建了一个验证程序,它接受规则对象来定义验证规则。

$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课程紧密结合,例如:检查它是否存在于规则数组中(这意味着是必需的还是可选的)。但是我宁愿让我的课程脱钩,我也不知道是否可能这样。

如果有人有好的建议,我可以自己执行进一步的实施。

2 个答案:

答案 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)

或者从"可选"开始上课并设置一个标志。检查其他课程中的那个标志。