[Zend Framework] Zend_Validate: 独自のバリデーションを作成する

独自のバリデーションを作成する方法について調べたのでまとめておきます。

こちらのカスタムバリデーションを設置してみます。

library/My/Validate/CompareDate.php
<?php
//require_once 'Zend/Validate/Abstract.php';
class My_Validate_CompareDate extends Zend_Validate_Abstract
{
    const DATE_INVALID = 'dateInvalid';
    protected $_messageTemplates = array(
        self::DATE_INVALID => "'%value%' is not greater than today"
    );
    public function isValid($value)
    {
        $this->_setValue($value);
        $date = new Zend_Date($value);
        $date->addDay(1);
        $now = new Zend_Date();
        // expecting $value to be YYYY-MM-DD
        if ($now->isLater($date)) {
            $this->_error(self::DATE_INVALID);
            return false;
        }
        return true;
    }
}
application/controllers/IndexController.php
<?php
require_once 'My/Validate/CompareDate.php';
class IndexController extends Zend_Controller_Action
{

こちらを参考にコントローラに書いて、使ってみます。

application/controllers/IndexController.php
        // 検証用データ
        $startTime = new Zend_Date('2010.08.01');
//        $endTime = $startTime->add(1, Zend_Date::MONTH);
        // 自作バリデータをインスタンス化
        $v = new My_Validate_CompareDate();
        // 検証でエラー判定されたら
        if (!$v->isValid($startTime)) {
            foreach ($v->getMessages() as $key => $value) {
                echo "$key : $value<br />\n";
            }
        }
結果
dateInvalid : '2010/08/01 0:00:00' is not greater than today

補遺

validする値以外を指定する方法が、まだいまいち理解できていないので、機会があれば下記を確認。

日付の比較とか。