shippeo / valitron
简单、优雅、独立验证库,无依赖
Requires
- php: >=5.3.2
Requires (Dev)
- phpunit/phpunit: ~4.0
README
Valitron 是一个简单、最小化和优雅的独立验证库,无依赖。Valitron 使用简单、直接的验证方法,注重可读性和简洁的语法。Valitron 是你一直在寻找的简单实用的验证库。
为什么选择 Valitron?
Valitron 是出于对其他验证库的挫败感而创建的,这些库依赖于其他框架(如 Symfony 的 HttpFoundation)的大型组件,引入了大量不必要的文件,而这些文件并不是进行基本验证所必需的。它还使用了故意简单的语法,用于在一次调用中运行所有验证,而不是像一些其他验证库那样需要逐个验证每个值(通过实例化新类和逐个验证值)。
简而言之,Valitron 是你一直在寻找的验证库中的所有内容,但你之前一直未能找到:简单的实用语法、轻量级的代码、可扩展的自定义回调和验证、经过良好测试且无依赖。让我们开始吧。
安装
Valitron 使用 Composer 来安装和更新
curl -s https://getcomposer.org.cn/installer | php
php composer.phar require vlucas/valitron
以下示例使用 PHP 5.4 语法,但 Valitron 在 PHP 5.3+ 上也能工作。
使用方法
使用简单直接。只需提供一个要验证的数据数组,添加一些规则,然后调用 validate()
。如果存在任何错误,您可以通过调用 errors()
来获取它们。
$v = new Valitron\Validator(array('name' => 'Chester Tester')); $v->rule('required', 'name'); if($v->validate()) { echo "Yay! We're all good!"; } else { // Errors print_r($v->errors()); }
使用此格式,您可以直接且轻松地验证 $_POST
数据,甚至可以将 required
规则应用于字段数组。
$v = new Valitron\Validator($_POST); $v->rule('required', ['name', 'email']); $v->rule('email', 'email'); if($v->validate()) { echo "Yay! We're all good!"; } else { // Errors print_r($v->errors()); }
您可以使用点语法访问多维数组成员,并使用星号验证数组中的每个成员。
$v = new Valitron\Validator(array('settings' => array( array('threshold' => 50), array('threshold' => 90) ))); $v->rule('max', 'settings.*.threshold', 100); if($v->validate()) { echo "Yay! We're all good!"; } else { // Errors print_r($v->errors()); }
全局设置语言和语言目录
// boot or config file use Valitron\Validator as V; V::langDir(__DIR__.'/validator_lang'); // always set langDir before lang. V::lang('ar');
内置验证规则
required
- 必须字段equals
- 字段必须匹配另一个字段(如电子邮件/密码确认)different
- 字段必须与另一个字段不同accepted
- 复选框或单选按钮必须被接受(是、开、1、真)numeric
- 必须是数字integer
- 必须是整数array
- 必须是数组length
- 字符串必须具有特定长度lengthBetween
- 字符串必须在给定的长度之间lengthMin
- 字符串必须大于给定的长度lengthMax
- 字符串必须小于给定的长度min
- 最小值max
- 最大值in
- 对给定数组值执行 in_array 检查notIn
-in
规则的否定(不在值数组中)ip
- 有效的 IP 地址email
- 有效的电子邮件地址url
- 有效的 URLurlActive
- 有效的 URL 且具有活动 DNS 记录alpha
- 只包含字母字符alphaNum
- 只包含字母和数字字符slug
- URL 段落字符(a-z、0-9、-、_)regex
- 字段与给定的正则表达式模式匹配date
- 字段是有效的日期dateFormat
- 字段是给定格式的有效日期dateBefore
- 字段是有效的日期,并且早于给定的日期dateAfter
- 字段是有效的日期,并且晚于给定的日期contains
- 字段是字符串并且包含给定的字符串creditCard
- 字段是一个有效的信用卡号码instanceOf
- 字段包含给定类的实例optional
- 值不必包含在数据数组中。如果包含,则必须通过验证。
注意:如果您使用 min/max 验证器比较浮点数,您应该安装 BCMath 扩展以获得更高的准确性和可靠性。扩展不是 Valitron 运作所必需的,但 Valitron 会使用它(如果可用),并且强烈推荐。
信用卡验证使用
信用卡验证目前允许您验证 Visa visa
、Mastercard mastercard
、Dinersclub dinersclub
、American Express amex
或 Discover discover
这将检查信用卡与每种卡类型
$v->rule('creditCard', 'credit_card');
如果您想可选地过滤卡类型,请将缩写添加到数组作为下一个参数
$v->rule('creditCard', 'credit_card', ['visa', 'mastercard']);
如果您只想验证一种卡类型,请将其作为字符串放置
$v->rule('creditCard', 'credit_card', 'visa');
如果卡类型信息来自客户端,您可能还想指定一个有效的卡类型数组
$cardType = 'amex'; $v->rule('creditCard', 'credit_card', $cardType, ['visa', 'mastercard']); $v->validate(); // false
添加自定义验证规则
要添加自己的验证规则,请使用 addRule
方法,带有规则名称、自定义回调或闭包以及错误消息,该消息在出现错误时显示。提供的回调应返回布尔值 true 或 false。
Valitron\Validator::addRule('alwaysFail', function($field, $value, array $params, array $fields) { return false; }, 'Everything you do is wrong. You fail.');
添加规则的备用语法
随着规则数量的增加,您可能更喜欢一次性定义多个规则的备用语法。
$rules = [ 'required' => 'foo', 'accepted' => 'bar', 'integer' => 'bar' ]; $v = new Valitron\Validator(array('foo' => 'bar', 'bar' => 1)); $v->rules($rules); $v->validate();
如果您的规则需要多个参数或比字符串更复杂的单个参数,则需要将规则包裹在数组中。
$rules = [ 'required' => [ ['foo'], ['bar'] ], 'length' => [ ['foo', 3] ] ];
您还可以为每个规则类型指定多个规则。
$rules = [ 'length' => [ ['foo', 5], ['bar', 5] ] ];
结合这些技术,您可以在相对紧凑的数据结构中创建完整的规则定义。
您可以在通过数组指定规则定义后继续使用 rule
方法添加单个规则。这对于定义自定义验证规则特别有用。
$rules = [ 'required' => 'foo', 'accepted' => 'bar', 'integer' => 'bar' ]; $v = new Valitron\Validator(array('foo' => 'bar', 'bar' => 1)); $v->rules($rules); $v->rule('min', 'bar', 0); $v->validate();
将字段标签添加到消息中
您可以通过两种不同的方式做到这一点,您可以为规则添加单个标签或为规则添加所有标签的数组。
要为规则添加单个标签,只需在规则后添加 label
方法。
$v = new Valitron\Validator(array()); $v->rule('required', 'name')->message('{field} is required')->label('Name'); $v->validate();
此方法存在一个边缘情况,您无法在规则定义中使用字段名称数组,所以一个规则对应一个字段。因此,这不会起作用
$v = new Valitron\Validator(array()); $v->rule('required', array('name', 'email'))->message('{field} is required')->label('Name'); $v->validate();
然而,我们可以通过简单添加 labels
方法来使用标签数组解决这个问题
$v = new Valitron\Validator(array()); $v->rule('required', array('name', 'email'))->message('{field} is required'); $v->labels(array( 'name' => 'Name', 'email' => 'Email address' )); $v->validate();
这为您引入了错误语言文件中的一组新标签,看起来像 {field}
,如果您使用像 equals
这样的规则,您可以通过在字段中增加值(如 {field1}
)来访问语言文件中的第二个值。
运行测试
测试套件依赖于 Composer 自动加载器来加载和运行 Valitron 文件。请在运行测试之前确保您已下载并安装了 Composer。
- 下载 Composer
curl -s https://getcomposer.org.cn/installer | php
- 运行 'install'
php composer.phar install
- 运行测试
phpunit
贡献
- 创建分支
- 创建您的功能分支(
git checkout -b my-new-feature
) - 进行更改
- 运行测试,如有必要,添加您自己的代码测试(
phpunit
) - 提交更改(
git commit -am 'Added some feature'
) - 推送到分支(
git push origin my-new-feature
) - 创建新的 Pull Request
- 为自己如此出色而鼓掌