我正试图在我正在工作的网站上实现验证功能。
我已经创建了一个名为Validator的接口,然后由我的类实现。我的接口中唯一的函数是validate($input)。
然后我有一个类,例如EmailValidator现在实现了这个。在validate()的实现中,它检查输入是否是有效的电子邮件,并分别返回true或false。
现在. .我想实现一个检查,即发送两个输入,然后检查它们是否相等。例如密码。由于这个接口函数只接受一次输入,所以不适合。
我可以用一个验证函数创建第二个接口,它接受两个输入,例如PairValidator。然而,这是实现我想要的最佳方式吗?
我的担心出现了,因为由于验证函数的可能性,我可能需要我可能有大量的接口,例如SetValidator检查一个值是否在一个集合中..
谢谢
有几种方法可以做到这一点。下面是一些不会破坏当前接口定义的简单方法:
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];
}
}
我用下面的接口方法解决了同样的问题:
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;
}
}
所以我在构造函数中设置了另一个要检查的表单键