oligriffiths / validation-component
Nooku平台验证组件
Requires
- nooku/installer: dev-develop
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()
检索;