2

我创建了一个自定义验证器:

class MyValidator extends AbstractValidator
{
    const ERROR_CONST = 'error';

    protected $dbAdapter;
    protected $messageTemplates = array(
        self::ERROR_CONST => "Error msg for '%value%'."
    );

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

    public function isValid($value, $context = null)
    {
        $this->setValue($value);
        /**
         * Do validation against db
         */

        if(/* Not valid */){
            $this->error(self::ERROR_CONST);
            return false;
        }
        return true;
    }
}

验证工作,我已经能够测试它。什么不起作用是错误消息的输出使用

echo $this->formElementErrors($form->get('action'));

输出的只是一个空的 UL。这是翻译的问题吗?当我在验证器中对 $this->getTranslator() 执行 get_class 时,我得到了验证器类名。当我 var_dump $this->getTranslator() 它输出空值。我是否需要为此设置翻译器才能工作?在哪里设置翻译器的最佳位置,以便我自己的验证器在系统范围内使用它?

4

2 回答 2

2

__construct因为您为验证器类定义了一个方法,所以__construct不会隐式调用父类:http: //php.net/manual/en/language.oop5.decon.php(见注释)

你应该修改你的__construct方法:

public function __construct($dbAdapter)
{
    $this->dbAdapter = $dbAdapter;
    //parent::__construct($options);
    parent::__construct(null); // or (void)
}

如您所见,$messageTemplates并且$messageVariables 是从 中“加载”的AbstractValidator::__construct,用于某些方法(error包括):

https://github.com/zendframework/zf2/blob/master/library/Zend/Validator/AbstractValidator.php#L73-L79

于 2013-09-26T18:50:02.900 回答
0

也许您忘记添加messageVariables

/**
 * Message variables
 * @var array
 */
protected $messageVariables = array(
    'value'  => 'value',
);
于 2013-09-25T15:37:48.530 回答