我正在尝试在我工作的网站上实现验证功能。
我创建了一个名为Validator的接口,我的类然后实现了该接口。我的界面中的单个函数是validate($ input)。
然后我有一个类,例如EmailValidator,它现在实现了这一点。在validate()的实现中,它检查输入是否是有效的电子邮件并分别返回true或false。
现在..我想实现一个检查,发送两个输入,我检查它们是否相等。例如,在密码的情况下。由于此接口函数只接受一个输入,因此不适合。
我可以使用validate函数创建第二个接口,它接受两个输入,例如PairValidator。这是实现我想要的最佳方式吗?
我的担忧是因为由于验证功能的可能性,我可能需要我可能有足够的接口,例如SetValidator,用于检查值是否在一个集合中。
由于
答案 0 :(得分:1)
有几种方法可以解决这个问题。其中一些简单的方法不会破坏您当前的界面定义:
1)展示需要作为数组进行验证的内容。
$validator->validate($_POST["password"],$_POST["password_repeat"]);
2)使用您需要的值之一构造验证器。
$validator = new ValidateEquals($_POST["password"]);
$validator->validate($_POST["password_repeat"]);
你可以做的一种方法会破坏你当前的界面,并且需要更改你现在拥有的任何验证器,从参数中完全删除参数,并通过func_get_args使用位置参数
interface Validator {
public function validate();
}
class EqualsValidator implements Validator {
public function validate(){
$args = func_get_args();
return $args[0] == $args[1];
}
}
答案 1 :(得分:0)
我用以下接口方法解决了同样的问题:
public function isValid($value, array $values = array());
$values
将所有表单字段都视为可用的关联数组。因此,如果需要,您可以使用这些值。
我的平等验证器如下:
class Equal implements IValidator
{
private $_varname = null;
public function __construct($varname)
{
$this->_varname = $varname;
}
public function isValid($value, array $values = array())
{
if (!array_key_exists($this->_varname, $values)) {
// set error message
return false;
}
$otherValue = $values[$this->_varname];
if ($value != $otherValue) {
// set error message
return false;
}
return true;
}
}
所以我在构造函数中设置了另一个表单键。