PHP多个接口实现验证功能?

时间:2013-05-21 15:11:28

标签: php oop interface

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

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

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

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

我可以使用validate函数创建第二个接口,它接受两个输入,例如PairValidator。这是实现我想要的最佳方式吗?

我的担忧是因为由于验证功能的可能性,我可能需要我可能有足够的接口,例如SetValidator,用于检查值是否在一个集合中。

由于

2 个答案:

答案 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;
    }
}

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