oligriffiths/validation-component

Nooku平台验证组件

0.0.1 2014-10-03 20:38 UTC

This package is not auto-updated.

Last update: 2024-09-24 03:13:15 UTC


README

Nooku框架0.9验证组件

该组件由4个主要部分组成

  • 可验证控制器行为
  • 可验证数据库行为
  • 约束
  • 验证器 & 过滤器

该组件设计得非常容易插拔。数据库模式也自动转换为约束并应用。

控制器行为

控制器行为负责在添加/编辑/保存/应用之前处理验证。错误被捕获并作为通知提出,而不是数据库行为抛出的异常。

要实现这一点,请将 'com://oligriffiths/validation.controller.behavior.validatable' 添加到将要保存实体的控制器中

数据库行为

数据库行为负责读取数据库模式并将其转换为相关约束。它还处理在插入/更新之前运行验证、在验证失败时存储当前数据以及在选择后重新填充对象,因此无需自行处理存储数据。

要实现这一点,请将 'com://oligriffiths/validation.database.behavior.validatable' 添加到实体的数据库表中

约束

约束和验证器的概念是从symphony借用的。约束包含用于执行验证的元数据。约束有类型,不同的约束包含不同的验证参数,例如

  • min - 包含最小值和验证失败时应显示的特定错误消息
  • image - 包含MIME类型、最小/最大宽度和高度以及相关的错误消息

约束必须实现 Nooku\Component\Validation\ConstraintInterface

验证器

验证器是验证过程中实际工作的地方。验证器接受一个值和一个约束,并验证该值是否符合约束参数。如果验证失败,验证器必须抛出一个包含特定错误消息的异常或成功时的true。如果没有特定的实现(验证器文件夹中的类),则将加载默认的验证器类。这反过来加载了来自Nooku库的相应的过滤器。一些验证器有自定义实现,这些实现不能通过过滤器完成,通常这些验证器需要输入为一个数组(Nooku过滤器自动遍历数组并验证值)

有两个额外的类型很重要

约束集

约束集包含一组约束,所有这些约束都可以通过 validate() 方法进行验证

验证集

验证集按键存储约束集,用于验证键/值对数组

验证器

以下是可用的验证器列表(如有必要提供说明)

alnum       <- alpha numeric
alpha
ascii
base64
blank
boolean
choice      <- array of pre-defined choices, e.g. ENUM columns
cmd         <- A 'command' is a string containing only the characters [A-Za-z0-9.-_]
count       <- counts the values in an array
date
digit
email
false
file
float
identifier  <- Ensure the value conforms to a URI identifier
image
int
internalurl
ip
json
lang        <- Language code in the format en-US
length
max
md5
min
notblank    <- Ensure a value is not blank, eg 0, '', false but not null
notnull
null
numeric     <- Ensures a value is numeric. See KFilterNumeric for definition
path        <- Ensure the value is a string formatted as a path
range
regex       <- Validates against the supplied regex
required    <- Alias to notblank, different message
string
time
timestamp
true
type        <- Validates the value against phps built in or any custom is_(type) method. Eg is_string, is_int. Can also check for value instanceof "class"
url
word        <- A 'word' is a string containing only the characters [A-Za-z_]

每个约束所需的具体参数(例如,长度需要最大参数)可以通过查看类或约束文件夹中的默认类的方法 _initialize 来查看。如果没有类存在,则不需要参数。

注意:除null和notnull之外,除非将 'allow_null' => true 通过约束配置传递,否则null值将不会进行验证。

用法

行为

数据库行为

这将自动为不同的列名和类型创建约束,并在插入和更新之前执行验证。

要将行为附加到您的其中一个表上,请在表 _initialize 方法中添加以下内容

protected function _initialize(\Nooku\Library\Config $config)
{
    $config->append(array(
        'behaviors' => array(
            'com:validation.database.behavior.validatable'
        )
    ))
}

如果验证失败,将抛出异常。

您可以通过传递一个约束属性到行为中,为表格中的每一列附加额外的自定义约束。约束数组中的每个键都对应于表格中的一列。此属性的值应该是附加的约束数组。

protected function _initialize(\Nooku\Library\Config $config)
{
    $config->append(array(
        'behaviors' => array(
            'com:validation.database.behavior.validatable' => array(
                'constraints' => array(
                    'password' => array('md5')
                )
            )
        )
    ))
}

上面的例子将MD5约束附加到了密码列。

注意:传递一个约束到列会导致从数据库加载的约束与自定义约束合并。为了抑制此功能,请通过'replace' => true传递。

控制器行为

如果您正在附加数据库行为,建议同时附加控制器行为,以便捕获数据库行为抛出的错误,并设置适当的重定向。

为此,请将行为添加到控制器中的_inititalize方法。

protected function _initialize(\Nooku\Library\Config $config)
{
    $config->append(array(
        'behaviors' => array(
            'com:validation.controller.behavior.validatable'
        )
    ))
}

自定义使用

约束和验证器也可以在任何需要验证数据的时候独立使用。您需要做的就是获取一个约束实例,并在约束上调用validate,传入您的数据值。

例如:

$this->getObject('com:validation.constraint.email')->validate('test@test.com');

如果电子邮件地址有效,将返回true,否则将抛出异常。

对于只需要true/false而不需要错误本身的简单验证;

$valid = $this->getObject('com:validation.constraint.email')->isValid('test@test.com');

异常将被捕获,并返回true/false。要访问抛出的具体错误,请在约束上调用getError()

约束集

约束也可以添加到约束集中;一个可以验证值的约束组。集合中的所有约束都必须通过验证,集合才是有效的。

$set = $this->getObject('com:validation.constraint.set', array(
    'constraints' => array(
        'com:validation.constraint.email',
        'com:validation.constraint.length' => array('min' => 0, 'max' => 150)
    )
));

$valid = $set->validate('test@test.com');
$errors = $set->getErrors();

您也可以通过调用$set->addConstraint()将约束添加到现有集合中。

$set->validate()将返回true/false表示成功/失败。具体错误可以通过使用$set->getErrors()检索;

验证集

验证器集合通过键名持有多个约束集。然后可以针对约束集进行数据验证,数据数组的每个键对应于一个持有约束集的键。

为了验证器集合有效,所有约束集都必须通过验证/返回true;

$set = $this->getObject('com:validation.validator.set',
    array('constraints' =>
        'email' => array('com:validation.constraint.email'),
        'name' => array('com:validation.constraint.length' => array('min' => 0, 'max' => 150))
    )
));

$valid = $set->validate(array('email' => 'test@test.com', 'name' => 'Jon Doe'));
$errors = $set->getErrors();

上面的示例将验证一个具有键email和name的数组/可迭代对象,与传递给验证器集合的约束进行匹配。

$set->validate()将在成功/失败时返回true/false。具体错误可以通过使用$set->getErrors()检索;