sglusnevs/violin

Violin 是一个易于使用、高度可定制的 PHP 验证器。

2.2.3 2020-06-05 13:46 UTC

This package is auto-updated.

Last update: 2024-09-05 23:30:16 UTC


README

Build Status Gitter

Violin 是一个易于使用、高度可定制的 PHP 验证器。

注意:此包处于快速发展阶段,不建议用于生产。

安装

使用 Composer 安装。

{
    "require": {
        "alexgarrett/violin": "2.*"
    }
}

基本用法

use Violin\Violin;

$v = new Violin;

$v->validate([
    'name'  => ['billy', 'required'],
    'age'   => [20, 'required|int']
]);

if($v->passes()) {
    echo 'Validation passed, woo!';
} else {
    echo '<pre>', var_dump($v->errors()->all()), '</pre>';
}

添加自定义规则

添加自定义规则很简单。如果闭包返回 false,则规则失败。

$v->addRuleMessage('isbanana', 'The {field} field expects "banana", found "{value}" instead.');

$v->addRule('isbanana', function($value, $input, $args) {
    return $value === 'banana';
});

$v->validate([
    'fruit' => ['apple', 'isbanana']
]);

添加自定义错误消息

您可以添加规则消息或字段消息,以获得完全的灵活性。

添加规则消息

$v->addRuleMessage('required', 'You better fill in the {field} field, or else.');

批量添加规则消息

$v->addRuleMessages([
    'required' => 'You better fill in the {field} field, or else.',
    'int'      => 'The {field} needs to be an integer, but I found {value}.',
]);

添加字段消息

您添加的任何字段消息都将先于任何默认或自定义规则消息使用。

$v->addFieldMessage('username', 'required', 'You need to enter a username to sign up.');

批量添加字段消息

$v->addFieldMessages([
    'username' => [
        'required' => 'You need to enter a username to sign up.'
    ],
    'age' => [
        'required' => 'I need your age.',
        'int'      => 'Your age needs to be an integer.',
    ]
]);

使用字段别名

字段别名可以帮助您格式化任何错误消息,而无需显示奇怪表单名称或创建自定义错误。

$v->validate([
    'username_box|Username' => ['' => 'required']
]);

// Error output: "Username is required."

回调函数

Violin 允许您将回调函数附加到在 验证之前之后 运行的函数。如果您需要进一步验证或触发事件,这可能会很有用。您可以添加任意数量的 之前之后 回调函数,并且也可以在它们中使用当前的 Violin 实例。

示例

$v->before(function($violin) {
    // This will happen before the validation..
});
$v->after(function($violin) {
    // This will happen after the validation..
});

扩展 Violin

您可以通过扩展 Violin 类来添加自定义规则、规则消息和字段消息。这样,如果您有任何依赖项(例如数据库连接或语言文件),您可以保持一个整洁的类来处理自定义验证。

class MyValidator extends Violin
{
    protected $db;

    public function __construct(PDO $db)
    {
        $this->db = $db;

        // Add rule message for custom rule method.
        $this->addRuleMessage('uniqueUsername', 'That username is taken.');
    }

    // Custom rule method for checking a unique username in our database.
    // Just prepend custom rules with validate_
    public function validate_uniqueUsername($value, $input, $args)
    {
        $user = $this->db->prepare("
            SELECT count(*) as count
            FROM users
            WHERE username = :username
        ");

        $user->execute(['username' => $value]);

        if($user->fetchObject()->count) {
            return false; // Username exists, so return false.
        }

        return true;
    }
}

// A database connection.
$db = new PDO('mysql:host=127.0.0.1;dbname=website', 'root', 'root');

// Instantiate your custom class with dependencies.
$v = new MyValidator($db);

$v->validate([
    'username' => ['billy', 'required|uniqueUsername']
]);

规则

此规则列表正在 进行中。当然,如果您想添加更多到基础规则集,您始终可以为此项目做出贡献。

alnum

如果值是字母数字的。

alnumDash

如果值是字母数字的。允许破折号和下划线。

alpha

如果值仅包含字母。

array

如果值是一个数组。

between(int, int)

检查值是否在定义的区间内。此检查是包含的,因此 5 在 5 和 10 之间。

bool

如果值是布尔值。

email

如果值是有效的电子邮件。

int

如果值是整数,包括字符串中的数字。1 和 '1' 都被视为整数。

number

如果值是数字,包括字符串中的数字。

数字字符串由可选的符号、任意数量的数字、可选的小数部分和可选的指数部分组成。因此,+0123.45e6 是一个有效的数值。十六进制(例如 0xf4c3b00c)、二进制(例如 0b10100111001)、八进制(例如 0777)表示法也是允许的,但仅限于没有符号、小数和指数部分。

ip

如果值是有效的 IP 地址。

min(int, [number])

检查字符串长度是否大于或等于给定的 int。要检查数字的大小,请传递可选的 number 选项。

$v->validate([
    'username' => ['billy', 'required|min(3)|max(20)'],
    'age' => ['20', 'required|min(18, number)|max(100, number)']
]);

max(int, [number])

检查字符串长度是否小于或等于给定的 int。要检查数字的大小,请传递可选的 number 选项。

required

如果值存在。

url

如果值格式化为有效的 URL。

matches(field)

检查一个给定的输入是否与另一个输入匹配。例如,检查 密码 是否与 确认密码 匹配。

date

如果给定的输入是有效的日期。

您可以验证可读性强的日期,例如'25th October 1961',以及DateTime实例。例如

$twoDaysAgo = new DateTime('2 days ago');
$date = $twoDaysAgo->format('d M Y');

$v->validate([
    'date' => [$date, 'required|date']
]);

已验证

如果某个字段已被'已验证'或未验证,这意味着它包含以下值之一:'是''开启''1'1正确'正确'。这可以用来确定一个HTML复选框是否被选中。

正则表达式(expression)

如果给定的输入与提供的正则表达式匹配。

贡献

请在GitHub上提交问题,或者如果您想直接贡献,请提交拉取请求。

运行测试

测试使用phpunit运行。运行./vendor/bin/phpunit来运行测试。