第 33 章 Zend_Validate

目录

33.1. 简介
33.1.1. 什么是校验器(validator)?
33.1.2. 校验器的基本用法
33.1.3. 定制消息
33.1.4. 使用静态 is() 方法
33.2. 校验器链
33.3. 写校验器
33.4. 校验 Email 地址
33.5. 校验主机名

33.1.  简介

Zend_Validate 组件提供一组通用的校验器。它也提供了一个简单的校验器链机制,即在用户定义的顺序下,多个校验器可以被用于单个的数据。

33.1.1.  什么是校验器(validator)?

校验器根据要求检查它的输入并产生一个布尔结果--是否输入被成功校验。如果输入不符合要求,校验器另外地提供信息来说明输入不符合要求。

例如,一个 web 应用可能要求一个用户名的长度在6 到12个字符并可能只包含数字和文字。一个校验器可以被用来确保用户名符合要求。如果一个用户名不符合一个或者全部两个要求,知道它到底不符合哪个要求将非常有用。

33.1.2. 校验器的基本用法

用这种方法定义校验为Zend_Validate_Interface提供了基础,它定义了两个方法,isValid()getMessages()isValid()方法根据提供的值来校验,当且仅当这个值通过校验条件,它返回true

如果isValid()返回falsegetMessages() 返回一个消息数组来解释校验失败的原因。

getErrors()方法返回一个为校验失败鉴别原因的短字符串数组。这些字符串打算鉴别错误。这些字符串被应用代码检查,不输出给用户。错误字符串是独立于类的;每个校验类定义它自己的错误字符串集合来识别错误的原因。每个类也提供const定义来匹配这些错误识别器。

[注意] 注意

getMessages() and getErrors()方法 只为最近isValid()的调用返回校验失败消息。对isValid()每个调用清除由前一个isValid()调用导致的任何消息和错误,因为很可能每个isValid()调用用于不同的输入值。

下面的例子示例一个e-mail地址的校验:

<?php
require_once 'Zend/Validate/EmailAddress.php';

$validator = new Zend_Validate_EmailAddress();

if ($validator->isValid($email)) {
    //
    // email 有效
    //
} else {
    //
    // email 无效; 打印原因
    //
    foreach ($validator->getMessages() as $message) {
        echo "$message\n";
    }
}

33.1.3.  定制消息

校验类提供了一个setMessage()方法,你可以指定校验失败后由getMessages()返回的消息的格式。这个方法的第一个参数是一个包含错误信息的的字符串。你可以在字符串中包含令牌,它将被和校验器相关的数据替换。所有的校验器都支持令牌 %value%;这被你传递给isValid()的值替换。其它的令牌按情况在每个校验类中被支持。例如,%max%是一个被Zend_Validate_LessThan支持的令牌。

第二个可选的参数是一个字符串,它和由getErrors()方法返回的错误识别器相对应。如果你忽略第二个参数,setMessage()假定你指定的消息应该被用为在校验类中声明的第一个消息。许多校验类只有一个错误信息,所以不需要清楚指定你所指定的消息。

<?php
require_once 'Zend/Validate/StringLength.php';

$validator = new Zend_Validate_StringLength(8);

$validator->setMessage(
    'The string \'%value%\' is too short; it must be at least %min% characters',
    Zend_Validate_StringLength::TOO_SHORT);

if (!$validator->isValid('word')) {
    $m = $validator->getMessages();
    echo $m[0];

    // echoes "The string 'word' is too short; it must be at least 8 characters"
}

你可以用setMessages()方法设置多个消息。它的参数是一个包含key/message对的数组。

<?php
require_once 'Zend/Validate/StringLength.php';

$validator = new Zend_Validate_StringLength(8, 12);

$validator->setMessages( array(
    Zend_Validate_StringLength::TOO_SHORT => 'The string \'%value%\' is too short',
    Zend_Validate_StringLength::TOO_LONG  => 'The string \'%value%\' is too long'
));

如果你的应用程序要求更灵活的错误报告,你可以访问和消息令牌同名的属性,这个消息令牌由给定的校验类支持。value属性在校验器中总是有效;它是一个你指定作为isValid()的参数的值。其他属性按照情况在每个校验类中被支持。

<?php
require_once 'Zend/Validate/StringLength.php';

$validator = new Zend_Validate_StringLength(8, 12);

if (!validator->isValid('word')) {
    echo 'Word failed: '
        . $validator->value
        . '; its length is not between '
        . $validator->min
        . ' and '
        . $validator->max
        . "\n";
}

33.1.4.  使用静态 is() 方法

如果加载一个校验类并创建这个校验器的实例不方便,你可以使用静态方法Zend_Validate::is()作为可选的调用风格。第一个参数是一个数据输入值,你将把它传递给isValid()方法。第二个参数是一个字符串,它和校验类的基本名字对应,和Zend_Validate名字空间相关。is()方法自动加载这个类,创建一个实例,并应用isValid()方法到数据输入。

<?php
require_once 'Zend/Validate.php';

if (Zend_Validate::is($email, 'EmailAddress')) {
    //
    // 是, email 有效
    //
}

如果校验器需要,你也可以传递一个构造器参数的数组。

<?php
require_once 'Zend/Validate.php';

if (Zend_Validate::is($value, 'Between', array(1, 12))) {
    //
    // Yes, $value is between 1 and 12
    //
}

isValid()方法一样,is()返回一个布尔值。当使用静态is()方法时,错误和消息不可用。

静态用法对于调用专用校验器可能方便,但如果为多重输入运行一个校验器,使用非静态用法更有效,创建一个校验器对象的实例并调用isValid()方法。

并且,Zend_Filter_Input 类允许你按需求实例化和运行多个过滤器和校验器类来处理输入数据集合,参见???。