PHP多个接口实现验证功能


PHP multiple interfaces to implement validation functionality?

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

我已经创建了一个名为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;
    }
}

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