Zend Framework学習の検証ing

19375 ワード

setMessageによるエラー情報のカスタマイズ
コード:
<?php
require_once 'Zend/Validate/EmailAddress.php';
function c_email($email)
{
    $validator = new Zend_Validate_EmailAddress();
    $validator->setMessage(
        "%value%      E-mail    "
        );
    if($validator->isValid($email)){
        echo "   E-mail  :";
        echo $email."  !<p>";
    }else{
        echo "   E-mail  :";
        echo $email."  !";
        echo "     :<p>";
        $message = $validator->getMessages();
        echo $message['emailAddressInvalidFormat'];
    }
}

$e_m1 = "[email protected]";
$e_m2 = "abc#123.com";
c_email($e_m1);
c_email($e_m2);

結果:
入力したE-mailアドレス:[email protected]有効!
入力E-mailアドレス:abc#123.com無効!失敗メッセージ:
abc#123.comが規格に合わないE-mailアドレスフォーマット
コメント:
機能は、setMessageメソッドでご希望のヒント情報を設定します.
 
静的メソッドis()
役割:is()メソッドで直接検証器を作成し、毎回newに行かずに作成します.
構文:
Zend_Validate::is($value,$classBaseName,$args);
コード:
<?php
require_once 'Zend/Validate.php';
function c_num($num){
    if(Zend_Validate::is($num,'Between',array(10,40)))//  is()    ,        
    {
        echo "<font color=\"#006600\">     :";
        echo $num."<p> 10 40  !</font>";
        echo "<p>";
    }else{
        echo "<font color=\"#ff0000\">     :";
        echo $num."<p>  10 40  !</font>";
        echo "<p>";
    }
}
$num1 = 5;
$num2 = 22;
c_num($num1);
c_num($num2);

結果:
入力値:5
10と40の間ではありません!
入力値:22
10と40の間に!
コメント:ソースコードを見てみましょう.
public static function is($value, $classBaseName, array $args = array(), $namespaces = array())
    {
        $namespaces = array_merge((array) $namespaces, self::$_defaultNamespaces, array('Zend_Validate'));
        $className  = ucfirst($classBaseName);
        try {
            if (!class_exists($className, false)) {
                require_once 'Zend/Loader.php';
                foreach($namespaces as $namespace) {
                    $class = $namespace . '_' . $className;
                    $file  = str_replace('_', DIRECTORY_SEPARATOR, $class) . '.php';
                    if (Zend_Loader::isReadable($file)) {
                        Zend_Loader::loadClass($class);
                        $className = $class;
                        break;
                    }
                }
            }

            $class = new ReflectionClass($className);
            if ($class->implementsInterface('Zend_Validate_Interface')) {
                if ($class->hasMethod('__construct')) {
                    $keys    = array_keys($args);
                    $numeric = false;
                    foreach($keys as $key) {
                        if (is_numeric($key)) {
                            $numeric = true;
                            break;
                        }
                    }

                    if ($numeric) {
                        $object = $class->newInstanceArgs($args);
                    } else {
                        $object = $class->newInstance($args);
                    }
                } else {
                    $object = $class->newInstance();
                }

                return $object->isValid($value);
            }
        } catch (Zend_Validate_Exception $ze) {
            // if there is an exception while validating throw it
            throw $ze;
        } catch (Exception $e) {
            // fallthrough and continue for missing validation classes
        }

        require_once 'Zend/Validate/Exception.php';
        throw new Zend_Validate_Exception("Validate class not found from basename '$classBaseName'");
    }

ソースコードがやっていることは、クラスを導入し、条件を導入し、判断し、結果を返すことです.不思議です.やや複雑です.ニマ、PHPを見くびってはいけない.こんなに上手に運用できて、感心しました.
チェッカチェーンaddValidator()の使用
チェッカチェーンは、複数のチェッカの接続です.すべてのチェックルールが通過すると、True値が返されます.
コード:
<?php
require_once 'Zend/Validate.php';
require_once 'Zend/Validate/StringLength.php';
require_once 'Zend/Validate/Alnum.php';
function c_content($value){
    $v_Chain = new Zend_Validate();
    $v_Chain->addValidator(new Zend_Validate_StringLength(8,12))
            ->addValidator(new Zend_Validate_Alnum());
    
    if($v_Chain->isValid($value)){
        echo "    :";
        echo $value."  !";
    }else{
        echo "    :";
        echo $value."  !";
        echo "     :<p>";
        foreach($v_Chain->getMessages() as $message){
            echo "$message<p>";
        }
    }
}

$temp1 = "123456";
$temp2 = "!@#$%^&*()";
$temp3 = "abcdefgh";
c_content($temp1);
c_content($temp2);
c_content($temp3);

結果:
入力した値:123456は無効です.失敗メッセージ:
'123456' is less than 8 characters long
入力した値:!@#$%^&*()無効です.失敗メッセージ:
'!@#$%^&*()' contains characters which are non alphabetic and no digits
入力した値:abcdefgh有効!
コメント:
内部の奥義を見てみましょう
public function addValidator(Zend_Validate_Interface $validator, $breakChainOnFailure = false)
    {
        $this->_validators[] = array(
            'instance' => $validator,
            'breakChainOnFailure' => (boolean) $breakChainOnFailure
            );
        return $this;
    }

addValidator()メソッドは、オブジェクトをプライベート変数_に格納します.validatorsでは、
public function isValid($value)
    {
        $this->_messages = array();
        $this->_errors   = array();
        $result = true;
        foreach ($this->_validators as $element) {
            $validator = $element['instance'];
            if ($validator->isValid($value)) {
                continue;
            }
            $result = false;
            $messages = $validator->getMessages();
            $this->_messages = array_merge($this->_messages, $messages);
            $this->_errors   = array_merge($this->_errors,   array_keys($messages));
            if ($element['breakChainOnFailure']) {
                break;
            }
        }
        return $result;
    }

検証するときは、遍歴検証すればいいです.