madesimple/php-form-validator

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

v2.9.0 2022-07-09 12:08 UTC

README

PHPUnit

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

安装

PHP 表单验证器可在 包管理器 上找到(使用语义版本控制),推荐通过 Composer 进行安装。只需将以下行添加到您的 composer.json 文件中

"madesimple/php-form-validator": "^2.8"

或者运行

composer require madesimple/php-form-validator

验证规则

验证规则是一个关联数组,其中包含点分隔的输入数组字段名到竖线分隔的规则字符串的映射。在点表示法中可以使用星号(*)作为通配符。例如,一组规则可能如下所示

// 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(全局唯一标识符)。

// 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']
];