0

我目前正在努力进行一些表单验证。我正在使用下面的类,它旨在成为一个流利的界面

class Validator implements ValidatorInterface {

    protected $_count_validators = 0;

    protected $_validators;

    protected $errorMsg;

    public function __construct($errorMsg = '')
    {
        $this->errorMsg = $errorMsg;
    }

    public function addValidator(ValidatorInterface $validator)
    {
        $this->_count_validators++;

        $this->_validators[] = $validator;
        return $this;
    }

    public function validate($value)
    {
        foreach($this->_validators as $validator) {
            if ($validator->validate($value) === false) {
                return false;
            }
        }
        return true;
    }

    public function getError()
    {
        return $this->errorMsg;
    }
}

它实际上工作了 75% - 我可以像这样添加验证器:

$postalcodeValidator = new \Framework\Formular\Validator\Validator();
$validatePostalcode= $postalcodeValidator->addValidator(new \Framework\Formular\Validator\NotEmpty)
                ->addValidator(new \Framework\Formular\IsNumeric);

$cityValidator = new \Framework\Formular\Validator\Validator();
$validateCity = $lastnameValidator->addValidator(new \Framework\Formular\Validator\NotEmpty);

现在我可以写:

$result = $postalcodeValidator->validate('00000');

- or -

$result = $cityValidator->validate('London');

我会有一个布尔值。我的问题是,我需要让设置一些错误变得容易。在上面的例子中——如果我只是在类中添加了一个 getErrors() 函数——我必须为类的每个新实例获取错误。我想创建一个函数来获取所有错误。

你能帮我解决这个问题吗?

提前致谢,

登劳

4

1 回答 1

3

一种简单的方法是在抽象验证器类中实现静态成员。您所有的具体验证器都对此进行了扩展,并将自动向该成员添加错误。最后,您可以通过一次调用获得此静态成员。但这是一种反模式,您必须在出现错误后重置此成员。

更好的做法是使用复合模式。一个类,您可以在其中添加一个或多个带有指定验证器的元素。这个复合类将对您分配的元素执行所有验证器,并从每个验证器收集所有错误消息。然后,您可以通过一次调用从您的组合中检索所有收集的错误消息。

有关复合模式的更多信息,请参见wiki 上的此处

这里举个例子..

$elementA = new ElementA; // implements Validable
$elementA->addValidator(new ValidatorA)->addValidator(new ValidatorB);
$elementB = new ElementB; // implements Validable
$elementB->addValidator(new ValidatorC);

$elementA->setValue('any_posted_value_to_validate');
$elementB->setValue('another_any_posted_value_to_validate');

$composite = new Composite; // implements Validable
$composite->addElement($elementA)->addElement($elementB);

if (!composite->isValid()) { // will execute all validators on all elements
    $errorMessages = $composite->getErrors();
}

在您的复合材料中..

public function isValid() 
{
    $isValid = true;
    foreach ($this->elements as $element) {
        if (!$element->isValid()) { // will execute all assigned validators to this element
            $this->addErrors($element->getErrors());
            $isValid = false;
        }
    }
    return $isValid;
}

有效接口

interface Validable
{
    public function isValid();
    public function getErrors();
}
于 2013-09-12T20:17:35.190 回答