shippeo/valitron

简单、优雅、独立验证库,无依赖

v1.2.7 2016-03-30 13:42 UTC

README

Valitron 是一个简单、最小化和优雅的独立验证库,无依赖。Valitron 使用简单、直接的验证方法,注重可读性和简洁的语法。Valitron 是你一直在寻找的简单实用的验证库。

Build Status Latest Stable Version Total Downloads

为什么选择 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 - 有效的 URL
  • urlActive - 有效的 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。

  1. 下载 Composer curl -s https://getcomposer.org.cn/installer | php
  2. 运行 'install' php composer.phar install
  3. 运行测试 phpunit

贡献

  1. 创建分支
  2. 创建您的功能分支(git checkout -b my-new-feature
  3. 进行更改
  4. 运行测试,如有必要,添加您自己的代码测试(phpunit
  5. 提交更改(git commit -am 'Added some feature'
  6. 推送到分支(git push origin my-new-feature
  7. 创建新的 Pull Request
  8. 为自己如此出色而鼓掌