caasi-co-zw/form-validation

适用于多维表单的简单、可扩展表单验证器

0.1.2 2022-11-25 10:39 UTC

This package is auto-updated.

Last update: 2024-09-15 02:18:04 UTC


README

开发中 PHPUnit

适用于多维表单的简单、可扩展表单验证器

安装

PHP 表单验证器可在 Packagist 上获取(使用语义版本控制),并且通过 Composer 安装是推荐方式。只需将以下行添加到您的 composer.json 文件中

"caasi-co-zw/form-validation":">=1.0"

或运行

composer require caasi-co-zw/form-validation

验证规则

验证规则是输入数组中点分隔的属性名与竖线分隔的规则字符串的关联数组。星号 * 可以在点分隔符中用作通配符。例如,一组规则可能如下所示

// Rules Set
$rulesSet = [
    'username'         => 'required|alpha-numeric|max-str-len:50',
    'firstName'        => 'required|human-name|required-with:lastName|max-str-len:255',
    'lastName'         => 'required|human-name|required-with:firstName|max-str-len:255',
    'address.line1'    => 'present',
    'address.postCode' => 'present',
    'likes.*.item'     => 'required-with:likes.*.rating|max-str-len:50'
    'likes.*.stars'    => 'required-with:likes.*.item|is:int|min:1|max:5'
];

// Valid Input
$input = [
    'username' => 'jbloggs',
    'firstName' => 'Joe',
    'lastName' => 'Bloggs',
    'address' => [
        'line1' => '123 Fake St',
        'postCode' => 'AB12 3CD',
    ]
    'likes' => [
        [
            'item'  => 'php-form-validator',
            'stars' => 5
        ]
    ]
];

以下是该库提供的所有验证规则

添加额外规则

可以向验证器添加额外规则以扩展其功能,为您的项目提供特定规则。如果您认为您的规则应该添加到核心库中,请提交拉取请求。要添加您的额外规则,您必须调用 addRulesetRuleMessage

简单的额外规则

例如,如果您想添加一个验证时区是否有效的规则

// Add the rule to the validator
$validator = new Validator;
$validator->addRule('timezone', function (Validator $validator, array $data, $pattern, $rule) {
    foreach ($validator->getValues($data, $pattern) as $attribute => $value) {
        if (null === $value) {
            continue;
        }
        if (in_array($value, listTimezones())) {
            continue;
        }

        $validator->addError($attribute, $rule);
    }
});
$validator->setRuleMessage('timezone', ':attribute must be an timezone');


// Validate using the new rule
$rules = [
    'timezone' => 'present|timezone',
];
$validator->validate($_POST, $rules);

带参数的额外规则

例如,如果您想添加一个验证标识符是否存在于您的数据库中的规则

// Add the rule to the validator
$validator = new Validator;
$validator->addRule('model-exists', function (Validator $validator, array $data, $pattern, $rule, $array $parameters) {
    // Connect to database
    $db = getDbInstance();
    list($model, $property) = $parameters;

    foreach ($validator->getValues($data, $pattern as $attribute => $value) {
        if (null === $value) {
            continue;
        }
        if (doesModelExist($db, $model, $property, $value)) {
            continue;
        }

        $validator->addError($attribute, $rule, [
            ':model' => $model
        ]);
    }
});
$validator->setRuleMessage('model-exists', ':attribute must be an existing :model');


// Validate using the new rule
$rules = [
    'uuid' => 'required|model-exists:user,uuid',
];
$validator->validate($_POST, $rules);

另一个示例,如果您想对子数组进行复杂验证

// Add the rule to the validator
$validator = new Validator;
$validator->addRule('complex', function (Validator $validator, array $data, $pattern, $rule, $array $parameters) {
    foreach ($validator->getValues($data, $pattern as $attribute => $value) {
        if (null === $value) {
            continue;
        }
        $rules['type'] = 'in:alpha,beta';
        switch ($value['type']) {
            case 'alpha':
                $rules['shared_field'] = 'is:int';
                $rules['alpha_specific_field'] = 'is:int';
                break;

            case 'beta':
                $rules['shared_field'] = 'in:blue,green';
                $rules['beta_specific_field'] = 'is:int';
                break;
        }

        // Apply the type specific rules to this part of the data
        $validator->validate($value, $rules, $attribute);
    }
});
// No need to define a rule message as only sub-rules can generate errors

存在

字段必须存在,但可以具有任何值,包括 null

// Example usage:
$rulesSet = [
    'field' => 'present',
];

必需

字段必须存在且不能为 null(可以是空字符串)。

// Example Usage
$rulesSet = [
    'field' => 'required'
];

如果必需

如果指定的字段和指定的值,则该字段是必需的。

// Example Usage
$rulesSet = [
    'field0' => 'required-if:field1:yes',
    'field1' => 'required|in:yes,no'
];

如果与必需

如果其他字段不是 null,则该字段是必需的。

// Example Usage
$rulesSet = [
    'field0' => 'required-with:field1',
    'field1' => 'required-with:field0'
];

所有必需

如果所有其他字段都不是 null,则该字段是必需的。

// Example Usage
$rulesSet = [
    'field0' => 'required-with-all:field1,field2',
    'field1' => 'is:int'
    'field2' => 'in:alpha,beta'
];

任何必需

如果其他任何字段不是 null,则该字段是必需的。

// Example Usage
$rulesSet = [
    'field0' => 'required-with-any:field1,field2',
    'field1' => 'is:int'
    'field2' => 'in:alpha,beta'
];

如果无必需

如果其他字段是 null,则该字段是必需的。

// Example Usage
$rulesSet = [
    'field0' => 'required-without:field1',
    'field1' => 'required-without:field0'
];

等于

字段值必须等于其他指定字段的值。

// Example Usage
$rulesSet = [
    'field0' => 'equals:field1',
    'field1' => 'required'
];

不等于

字段值不能等于其他指定字段的值。

// Example Usage
$rulesSet = [
    'field0' => 'not-equals:field1',
    'field1' => 'required'
];

相同

字段值必须与另一个指定字段的值相同。

// Example Usage
$rulesSet = [
    'field0' => 'identical:field1',
    'field1' => 'required'
];

不同

字段值必须与另一个指定字段的值不同。

// Example Usage
$rulesSet = [
    'field0' => 'not-identical:field1',
    'field1' => 'required'
];

字段必须等于指定的选项之一。

// Example Usage
$rulesSet = [
    'field' => 'in:apple,pear,orange'
];

不在

字段不能等于指定的选项之一。

// Example Usage
$rulesSet = [
    'field' => 'not-in:apple,pear,orange'
];

包含

字段应该是一个数组,必须包含所有指定的选项(可能包含未列出的其他值)。

// Example Usage
$rulesSet = [
    'field' => 'contains:apple,pear,orange'
];

仅包含

字段应该是一个数组,必须仅包含指定的选项。

// Example Usage
$rulesSet = [
    'field' => 'contains-only:apple,pear,orange'
];

最小数组计数

字段应该是一个数组,并且必须具有至少指定的 array_count 值。

// Example Usage
$rulesSet = [
    'field' => 'min-arr-count:1'
];

最大数组计数

该字段应为数组,并且其array_count必须不超过指定的值。

// Example Usage
$rulesSet = [
    'field' => 'max-arr-count:5'
];

最小值

该字段应为数字,并且必须至少为指定的值。

// Example Usage
$rulesSet = [
    'field' => 'min:1'
];

最大值

该字段应为数字,并且必须不超过指定的值。

// Example Usage
$rulesSet = [
    'field' => 'max:5'
];

大于

该字段应为数字,并且必须大于另一个字段的值。

// Example Usage
$rulesSet = [
    'field0' => 'greater-than:field1'
];

小于

该字段应为数字,并且必须小于另一个字段的值。

// Example Usage
$rulesSet = [
    'field0' => 'less-than:field1'
];

字母

该字段只能包含字母字符。

// Example Usage
$rulesSet = [
    'field' => 'alpha'
];

字母数字

该字段只能包含字母和数字字符。

// Example Usage
$rulesSet = [
    'field' => 'alpha-numeric'
];

最小字符串长度

该字段应为字符串,并且其strlen必须至少为指定的值。

// Example Usage
$rulesSet = [
    'field' => 'min-str-len:3'
];

最大字符串长度

该字段应为字符串,并且其strlen必须不超过指定的值。

// Example Usage
$rulesSet = [
    'field' => 'max-str-len:50'
];

字符串长度

该字段应为字符串,并且其strlen必须正好为指定的值。

// Example Usage
$rulesSet = [
    'field' => 'str-len:10'
];

人名

该字段必须是有效的名字。

// Example Usage
$rulesSet = [
    'field' => 'human-name'
];

该字段必须是指定的基本PHP类型。必须存在一个对应的is_<type>方法。

// Example Usage
$rulesSet = [
    'field' => 'is:numeric' // any basic PHP type (must have corresponding is_<type> method)
];

电子邮件

该字段必须是一个有效的电子邮件地址。

// Example Usage
$rulesSet = [
    'field' => 'email'
];

日期

该字段必须是在指定格式下的有效日期(默认为'Y-m-d')。

// Example Usage
$rulesSet = [
    'field' => 'date' // defaults to 'Y-m-d'
];

URL

该字段必须是一个有效的URL。

// Example Usage
$rulesSet = [
    'field' => 'url'
];

UUID

该字段必须是一个有效的UUID(\ Universally Unique Identifier)。

// Example Usage
$rulesSet = [
    'field' => 'uuid'
];

卡号

该字段必须是一个有效的卡号。有关更多详细信息,请参阅http://stackoverflow.com/questions/174730/what-is-the-best-way-to-validate-a-credit-card-in-php

// Example Usage
$rulesSet = [
    'field' => 'card-number'
];

正则表达式

该字段必须匹配提供的正则表达式模式。当使用此规则时,指定规则为数组,特别是当正则表达式包含|字符时。有关更多详细信息,请参阅https://php.ac.cn/preg_match

// Example Usage
$rulesSet = [
    'field' => ['regex:/^[Ff]oobar[1!]+$/']
];

非正则表达式

该字段不得匹配提供的正则表达式模式。当使用此规则时,指定规则为数组,特别是当正则表达式包含|字符时。有关更多详细信息,请参阅https://php.ac.cn/preg_match

// Example Usage
$rulesSet = [
    'field' => ['not-regex:/^[abc]{1,3}\W+$/i']
];