很多时候,您会在注册表单中看到此验证,您可以使用注册表单对象进行验证,也可以使用 User 对象。
无论哪种方式Zend_Validate::DbNoRecordExists
或Zend_Validate::DbRecordExists
可能被证明是有用的,并且可以用作表单验证器:
//form demo
class Reg_Form extends Zend_Form
{
public function init() {
$name = new Zend_Form_Element_Text('name');
$name->setLabel('Name');
$name->setAttrib('placeholder', 'Username');
$name->setOptions(array('size' => 20));
$name->addFilter('StringToLower');
//truncated for brevity
$name->addValidator(new Zend_Validate_Db_NoRecordExists(array(
'table' => 'users',
'field' => 'name'
)));
$this->addElement($name);
}
}
或模型中的独立验证器。
//Entity Model demo, This is used to check against MP3 database
/**
* Does record already exist in DB
*
* Pass in the mapper to use as a string.
* Will trigger predefined validator DbNoRecordExists
*
* @param string $mapper accepted values are: 'album' 'artist' 'track'
* @return boolean returns true if no record exists
*/
protected function dbNoExist($mapper)
{
switch ($mapper) {
case 'album':
$value = $this->taginfo->getAlbum();
$options = array(
'table' => 'album',
'field' => 'title'
);
break;
case 'artist':
$value = $this->taginfo->getArtist();
$options = array(
'table' => 'artist',
'field' => 'name'
);
break;
case 'track':
$value = $this->taginfo->getMd5();
$options = array(
'table' => 'track',
'field' => 'hash'
);
}
$validator = new Zend_Validate_Db_NoRecordExists($options);
if ($validator->isValid($value)) {
//no record exists
return TRUE;
} else {
//record exists
return FALSE;
}
}
我尝试在我的项目中回答这些问题的方式是:
如果我将数据持久性从 MySql 更改为平面文件(或其他方法),我还需要执行此操作(验证)吗?
如果是这样,代码将进入实体模型(用户)。如果不是,那么代码将进入映射器。我意识到这有点简单,但它通常会让我朝着正确的方向前进。
[编辑]
就我个人而言,如果可能的话,我什至会在表单发布之前进行这一小部分验证。我想在用户发布表单之前让他知道他是否已经拥有该电子邮件的帐户,这样可以节省我们双方的时间和挫败感。最终验证始终可以在用户模型中完成。
祝你好运。