madesimple / php-form-validator
简单、可扩展的多维表单验证器
Requires
- php: >=7.1
- madesimple/php-arrays: ^2.0
Requires (Dev)
- phpunit/phpunit: ^9.5
README
简单、可扩展的多维表单验证器
安装
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 ] ] ];
以下都是本库提供的所有验证规则
添加额外规则
可以将额外规则添加到验证器中,以扩展其功能,为您的项目提供特定规则。如果您认为您的规则应该添加到核心库中,请提交一个拉取请求。要添加您的额外规则,必须调用 addRule
和 setRuleMessage
。
简单的额外规则
例如,如果您想要添加一个验证时区是否有效的规则
// 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'] ];