1

我正在尝试在我正在工作的网站上实现验证功能。

我创建了一个名为 Validator 的接口,然后我的类将实现该接口。我的界面中的单个函数是 validate($input)。

然后我有一个类,例如 EmailValidator 现在实现了这个。在 validate() 的实现中,它检查输入是否是有效的电子邮件,并分别返回 true 或 false。

现在..我想实施一个检查,发送两个输入,然后检查它们是否相等。例如在密码的情况下。由于此接口函数只接受一个输入,因此不适合。

我可以创建带有验证函数的第二个接口,该函数接受两个输入,例如 PairValidator。然而,这是实现我想要的最佳方式吗?

我的担心是因为我可能需要验证功能的可能性,我可能有很多接口,例如用于检查值是否在集合中的 SetValidator。

谢谢

4

2 回答 2

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];
    }
}
于 2013-05-21T15:34:37.707 回答
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;
    }
}

所以我在构造函数中设置了另一个要检查的表单键。

于 2013-05-21T15:26:00.313 回答