1 继承关系:
各种验证器都继承于Zend_Validate_Abstract, Zend_Validate_Abstract继承了Zend_Validate_Interface接口.
Zend_Validate_Interface接口只提供了一个验证器的基础规范, Zend_Validate_Abstract实现了验证器的主要功能. 所以实际的验证器,也就是所谓的有效性检查组件只要继承这个类就可以了. 子类的扩展相对比较容易 .
2 Zend_Validate_Abstract 中消息与错误:
阅读Validate代码发现, 记录错误,只需要调用父类的_error(); 方法就可以了,并且唯一的参数就是一个错误模板[ $_messageTemplates ] , 该变量在子类中实际的验证器中定义,也就是Zend_Validate_Abstract的子类 . 父类会调用子类的消息模板,并处理错误消息.
阅读父类的_error(); 方法可以发现, 一个错误消息记录两个结果,一个是错误消息,一个是错误类型.
- /**
- * @param string $messageKey OPTIONAL
- * @param string $value OPTIONAL
- * @return void
- */
- protected function _error($messageKey = null, $value = null)
- {
- if ($messageKey === null) {
- $keys = array_keys($this->_messageTemplates);
- $messageKey = current($keys);
- }
- if ($value === null) {
- $value = $this->_value;
- }
- $this->_errors[] = $messageKey;
- $this->_messages[$messageKey] = $this->_createMessage($messageKey, $value);
- }
_errors[] 数组中记录在子类中定义的错误类型, _messages[] 中记录的是实际的粗五消息. 并且这里 $this->_createMessage($messageKey, $value);实现了错误消息和消息中预定义变量的替换, 这些都是在子类中定义的,父类直接调用,阅读这些代码可以知道, ZF 的验证器,只能实例化实用,不能静态调用 .
在抽象类Zend_Validate_Abstract中, setMessages(array $messages)方法或 setMessage($messages,$key), 并不能替换消息模板中的预定义变量, 只能是在类的预定义属性 _messages中添加一项值, 变量的替换工作由 _createMessage() 方法来完成.