Zend_Validate_Db_NoRecordExists を使ってみた

前回の続き。


Zend_Filter_Input と組み合わせて使ってみた。

<?php
$validations = array(
    'name' => array(
        new Gene_Validate_NotEmpty(),
        new Zend_Validate_Regex('/^[0-9A-Za-z+\_]*$/ '),
        new Zend_Validate_Db_NoRecordExists('users', 'name', null, $adapter),
        'messages' => array(
            0 => $this->_translate->_('Please enter user name.'),
            1 => $this->_translate->_('Invalid user name.'),
            2 => $this->_translate->_('Name is already exists.')
        )
    ),
    'email' => array(
        new Gene_Validate_NotEmpty(),
        new Zend_Validate_EmailAddress(),
        new Zend_Validate_Db_NoRecordExists('users', 'email', null, $adapter),  
        'messages' => array(
            0 => $this->_translate->_('Please enter email.'),
            1 => $this->_translate->_('Email is invalid.'),
            2 => $this->_translate->_('Email is already exists.')
        )
    ),
    'password' => array(
        new Gene_Validate_NotEmpty(),
        'messages' => array(
            0 => $this->_translate->_('Please enter password.')
        )
    ),
    'token' => array(
        new Zend_Validate_Identical($session),
        'message' => array(
            0 => $this->_translate->_('Token invalid.')
        )
    )
);
$validator = new Zend_Filter_Input(null, $validations);
$ret = $validator->setData($this->_getAllParams())->isValid();

とかして、データベースの users テーブルに name カラムと email カラムに登録しようとするデータがあったらエラーになる。


Zend_Validate_Db_NoRecordExists() の第 4 引数にはデータベースの接続アダプターを設定する。
何もしないとデフォルトで、 Zend_Db_Table_Abstract::getDefaultAdapter() が中で呼ばれる。


いちいちデータが存在するかの判定ロジックを書かなくて良いのが素敵。