この検証は登録フォームで行われることがよくあります。登録フォーム オブジェクトを使用して検証を行うことも、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 からフラット ファイル (またはその他の方法) に変更した場合でも、このアクション (検証) を実行する必要がありますか?
その場合、コードはエンティティ モデル (ユーザー) に入ります。そうでない場合、コードはマッパーに入ります。これはちょっと単純すぎると思いますが、通常は正しい方向に進むことができます。
[編集]
個人的には、可能であればフォームが投稿される前に、この小さな検証を行うつもりです。ユーザーがフォームを投稿する前に、その電子メールでアカウントを既に持っているかどうかをユーザーに知らせたいので、時間とフラストレーションの両方を節約できます。最終的な検証は常にユーザー モデルで行うことができます。
幸運を。