沙多米格尔 / verum-php
PHP 服务端表单验证库
Requires
- php: ^8.0
Requires (Dev)
- nunomaduro/phpinsights: ^2.4
- phpmetrics/phpmetrics: ^2.8
- phpstan/phpstan: ^0.12.93
- phpunit/phpunit: ^9
- roave/security-advisories: dev-master
- vimeo/psalm: ^4.24
- dev-main
- v2.2.3
- v2.2.2
- v2.2.1
- v2.2.0
- v2.1.1
- v2.1.0
- v2.0.4
- v2.0.3
- v2.0.2
- v2.0.1
- v2.0.0
- v1.0.0
- dev-release-please--branches--main--components--release-please-action
- dev-fix/multi-name-field-validation
- dev-fix/indexed-fields-validation
- dev-fix/multi-name-validation
- dev-feat/release-please-setup
- dev-feat/multi-lang-support
- dev-fix/min-length-validation
- dev-bump-phpunit-to-9
- dev-t642/add-the-integer-rule
- dev-release/clean-changelog
- dev-release/20210727
- dev-2021-07-27/update-readme
- dev-update-composer-dep/2021-07-27
- dev-t-358/rule-tables-and-dutch-translation
- dev-t-358/add-rule-tables
- dev-t-355/fix-psalm-errors
- dev-t-309/add-a-new-translation-file
- dev-t-310/update-javascript-dependencies
- dev-t-306/remove-eslint-config-cecilia
- dev-t-305/setup-travis-ci
This package is auto-updated.
Last update: 2024-09-21 14:42:13 UTC
README
Verum PHP
Verum PHP 是一个 PHP 的服务端验证库,可以轻松地验证数组(支持文件)。它包含自定义错误消息、规则、内置翻译,且无依赖。
PHP 服务端验证库
- 验证数组(支持文件)
- 自定义错误消息
- 自定义规则
- 内置翻译
- 无依赖
目录
入门
安装
使用 Composer 安装 Verum PHP
composer require sandromiguel/verum-php
用法
简单用法示例
验证简单的注册表单(姓名、电子邮件和年龄)
use Verum\Validator; $rules = [ 'name' => [ 'rules' => [ 'required', ], ], 'email' => [ 'rules' => [ 'required', 'email', ], ], 'age' => [ 'rules' => [ 'numeric', ], ], ]; $validator = new Validator($_POST, $rules); echo json_encode( [ 'valid' => $validator->validate(), 'errors' => $validator->getErrors(), ] );
有效表单示例
输入
[
'name' => 'John Doe',
'email' => 'johndoe@example.com',
'age' => '20',
]
输出
{
"valid": true,
"errors": []
}
无效表单示例
输入
[
'name' => '',
'email' => 'some text',
'age' => 'some text',
]
输出
{
"valid": false,
"errors": {
"name": {
"label": null,
"rules": {
"required": "This field is required."
}
},
"email": {
"label": null,
"rules": {
"email": "This field must be a valid email address."
}
},
"age": {
"label": null,
"rules": {
"numeric": "This field must be numeric."
}
}
}
}
使用 RuleEnum 类
您可以使用 RuleEnum 类访问所有规则名称。
use Verum\Validator; use Verum\Enum\RuleEnum; $rules = [ 'name' => [ 'rules' => [ RuleEnum::REQUIRED, ], ], ... ];
指定字段标签(命名输入)
$rules = [ 'name' => [ 'label' => 'Name', 'rules' => [ RuleEnum::REQUIRED, ], ], ... ];
输出
{
...
"errors": {
"name": {
"label": "Name",
"rules": {
"required": 'The "Name" field is required.'
}
},
...
}
}
为每种语言指定字段标签
$rules = [ 'name' => [ 'label' => [ 'en' => 'Name', 'pt-pt' => 'Nome', ], 'rules' => [ RuleEnum::REQUIRED, ], ], ... ];
输出(pt-pt)
{
...
"errors": {
"name": {
"label": "Nome",
"rules": {
"required": 'O campo "Nome" é obrigatório.'
}
},
...
}
}
指定消息语言
您可以使用一些内置翻译
'en'-> 英语(默认)'nl-nl'-> 荷兰语'pt-pt'-> 葡萄牙语-葡萄牙'pt-br'-> 葡萄牙语-巴西
$validator = new Validator($_POST, $rules, 'pt-pt');
使用 LangEnum 类指定消息语言
use Verum\Validator; use Verum\Enum\LangEnum; ... $validator = new Validator($_POST, $rules, LangEnum::PT_PT);
指定自定义错误消息
- 用于覆盖默认错误消息。
- 用于本地化。
... $validator = new Validator($_POST, $rules); $validator->addSimpleCustomMessage('min_length', 'Min Length rule custom error message'); ...
输出示例
{
...
"errors": {
"name": {
"label": "Name",
"rules": {
"min_length": "Min Length rule custom error message"
}
},
...
}
}
指定带占位符的自定义错误消息
... $validator = new Validator($_POST, $rules); $validator->addSimpleCustomMessage('min_length', 'Number of characters detected: {param:1}. Field name: "{param:2}".'); ...
输出示例
{
...
"errors": {
"name": {
"label": "Name",
"rules": {
"min_length": 'Number of characters detected: 5. Field name: "Name".'
}
},
...
}
}
指定带有和没有标签的字段的自定义错误消息
... $validator = new Validator($_POST, $rules); $validator->addCustomMessage( 'required', 'Custom error message with label for required rule. Label: {param:1}.', 'Custom error message without label for required rule.' ); ...
输出 - 带标签的字段
{
...
"errors": {
"name": {
"label": "Name",
"rules": {
"required": 'Custom error message with label for required rule. Label: Name.'
}
},
...
}
}
输出 - 没有标签的字段
{
...
"errors": {
"name": {
"label": null,
"rules": {
"required": "Custom error message without label for required rule."
}
},
...
}
}
一次指定多个自定义错误消息
... $validator = new Validator($_POST, $rules); $validator->addCustomMessages( [ 'min_length' => 'Custom message for the "min_length" rule.', 'required' => 'Custom message for the "required" rule.', // other messages ... ] ); ...
一次指定带有和没有标签的字段的多个自定义错误消息
... $validator = new Validator($_POST, $rules); $validator->addCustomMessages( [ 'numeric' => [ 'withLabel' => 'Custom message with label for "numeric" rule. Label: {param:1}.', 'withoutLabel' => 'Custom message without label for "numeric" rule.', ], 'min_length' => [ 'withLabel' => 'Custom message with label for "min_length" rule. Label: {param:2}, value: {param:1}.', 'withoutLabel' => 'Custom message without label for "min_length" rule. Value: {param:1}.', ], // other messages ... ] ); ...
处理多名称字段
使用 Verum PHP,您可以更有效地处理多名称字段。这些字段在其名称中包含语言标识符或其他变体。例如,如果您有 title.en、title.pt、description.en 和 description.pt 这样的字段,您可以使用通配符为它们指定规则。
$rules = [ 'title.*' => [ 'rules' => [ RuleEnum::REQUIRED, ], ], 'description.*' => [ 'rules' => [ RuleEnum::REQUIRED, RuleEnum::MIN_LENGTH => 10, ], ], ]; $validator = new Validator($_POST, $rules); // ...
输出示例
{
"valid": false,
"errors": {
"title.en": {
"label": null,
"rules": {
"required": "This field is required."
}
},
"title.pt": {
"label": null,
"rules": {
"required": "This field is required."
}
},
"description.en": {
"label": null,
"rules": {
"required": "This field is required.",
"min_length": "This field must be at least 10 characters long."
}
},
"description.pt": {
"label": null,
"rules": {
"required": "This field is required.",
"min_length": "This field must be at least 10 characters long."
}
}
}
}
自定义验证
您可以使用自定义验证并注入错误消息。
if ($myCustomValidationFail) { $validator->addError( 'someFieldName', 'Some field name', ['no_duplicate' => 'A user already exists with that username')] ); // ... }
可用规则
- alpha
- alpha_numeric
- between
- between_length
- boolean_value
- contains
- date
- equals
- file_max_size
- file_mime_type
- float_number
- image_max_height
- image_max_width
- image_min_height
- image_min_width
- integer
- ip
- ipv4
- ipv6
- max
- max_length
- min
- min_length
- numeric
- regex
- required
- slug
- url
alpha
检查值是否仅包含字母字符。
$rules = [ 'nickname' => [ 'label' => 'Nickname', 'rules' => [ RuleEnum::ALPHA, ], ], ];
alpha_numeric
检查值是否仅包含字母数字字符。
$rules = [ 'nickname' => [ 'label' => 'Nickname', 'rules' => [ RuleEnum::ALPHA_NUMERIC, ], ], ];
between
检查值是否介于两个值之间。
$rules = [ 'age' => [ 'label' => 'Age', 'rules' => [ RuleEnum::BETWEEN => [12, 29], ], ], ];
between_length
检查值的字符数是否介于最小和最大值之间。
$rules = [ 'nickname' => [ 'label' => 'Nickname', 'rules' => [ RuleEnum::BETWEEN_LENGTH => [3, 15], ], ], ];
boolean_value
检查值是否为布尔值。对于 1/0、'1'/'0'、'on'/'off'、'yes'/'no'、true/false 返回 true。
$rules = [ 'light' => [ 'label' => 'Light', 'rules' => [ RuleEnum::BOOLEAN_VALUE, ], ], ];
contains
检查值是否在数组中。
$rules = [ 'priority' => [ 'label' => 'Priority', 'rules' => [ RuleEnum::CONTAINS => ['low', 'high'], ], ], ];
date
检查值是否是有效的日期(Y-m-d)或自定义格式。
默认格式(Y-m-d)
$rules = [ 'dob' => [ 'label' => 'Date of birth', 'rules' => [ RuleEnum::DATE, ], ], ];
自定义格式(例如 d.m.Y)
$rules = [ 'dob' => [ 'label' => 'Date of birth', 'rules' => [ RuleEnum::DATE => ['d.m.Y'], ], ], ];
检查值是否具有有效的电子邮件格式。
$rules = [ 'email' => [ 'label' => 'Email', 'rules' => [ RuleEnum::EMAIL, ], ], ];
equals
检查值是否等于另一个值。
$rules = [ 'repeat_password' => [ 'label' => 'Repeat Password', 'rules' => [ RuleEnum::EQUALS => ['password'], ], ], ];
与 'text' 的比较
file_max_size
检查文件大小是否不超过给定值。
输入字节数值。
$rules = [ 'profile_photo' => [ 'label' => 'Profile Photo', 'rules' => [ RuleEnum::FILE_MAX_SIZE => [102400], ], ], ];
与 102400 字节比较
file_mime_type
检查文件类型是否允许。
$rules = [ 'profile_photo' => [ 'label' => 'Profile Photo', 'rules' => [ RuleEnum::FILE_MIME_TYPE => ['image/png', 'image/jpeg'], ], ], ];
float_number
检查值是否为浮点数。
$rules = [ 'price' => [ 'label' => 'Price', 'rules' => [ RuleEnum::FLOAT_NUMBER, ], ], ];
image_max_height
检查图像高度是否不超过给定值。
$rules = [ 'profile_photo' => [ 'label' => 'Profile Photo', 'rules' => [ RuleEnum::IMAGE_MAX_HEIGHT => [600], ], ], ];
image_max_width
检查图像宽度是否不超过给定值。
$rules = [ 'profile_photo' => [ 'label' => 'Profile Photo', 'rules' => [ RuleEnum::IMAGE_MAX_WIDTH => [1000], ], ], ];
image_min_height
检查图像高度是否不小于给定值。
$rules = [ 'profile_photo' => [ 'label' => 'Profile Photo', 'rules' => [ RuleEnum::IMAGE_MIN_HEIGHT => [300], ], ], ];
image_min_width
检查图像宽度是否不小于给定值。
$rules = [ 'profile_photo' => [ 'label' => 'Profile Photo', 'rules' => [ RuleEnum::IMAGE_MIN_WIDTH => [500], ], ], ];
integer
检查值是否为整数。
$rules = [ 'distance' => [ 'label' => 'Distance', 'rules' => [ RuleEnum::INTEGER, ], ], ];
ip
检查值是否为有效的 IP 地址。
$rules = [ 'ip' => [ 'label' => 'IP', 'rules' => [ RuleEnum::IP, ], ], ];
ipv4
检查值是否为有效的 IPv4 地址。
$rules = [ 'ipv4' => [ 'label' => 'IPv4', 'rules' => [ RuleEnum::IPV4, ], ], ];
ipv6
检查值是否为有效的 IPv6 地址。
$rules = [ 'ipv6' => [ 'label' => 'IPv6', 'rules' => [ RuleEnum::IPV6, ], ], ];
max
检查值是否不超过给定值。
$rules = [ 'people' => [ 'label' => 'People', 'rules' => [ RuleEnum::MAX => [5], ], ], ];
max_length
检查值的字符数是否不超过给定值。
$rules = [ 'nickname' => [ 'label' => 'Nickname', 'rules' => [ RuleEnum::MAX_LENGTH => [2], ], ], ];
min
检查值是否不小于给定值。
$rules = [ 'people' => [ 'label' => 'People', 'rules' => [ RuleEnum::MIN => [2], ], ], ];
min_length
检查值的字符数是否不小于给定值。
$rules = [ 'nickname' => [ 'label' => 'Nickname', 'rules' => [ RuleEnum::MIN_LENGTH => [2], ], ], ];
numeric
检查值是否为数值。
$rules = [ 'age' => [ 'label' => 'Age', 'rules' => [ RuleEnum::NUMERIC, ], ], ];
regex
检查值是否与给定的正则表达式匹配。
$rules = [ 'path' => [ 'label' => 'Path', 'rules' => [ RuleEnum::REGEX => ['/\/client\/[0-9a-f]+$/'], ], ], ];
使用 '/\/client\/[0-9a-f]+$/' 模式进行验证
required
检查值是否不为空。
$rules = [ 'name' => [ 'label' => 'Name', 'rules' => [ RuleEnum::REQUIRED, ], ], ];
slug
检查值是否为有效的路径别名(例如:hello-world_123)。
$rules = [ 'slug' => [ 'label' => 'Slug', 'rules' => [ RuleEnum::SLUG, ], ], ];
url
检查值是否为有效的 URL。
$rules = [ 'url' => [ 'label' => 'URL', 'rules' => [ RuleEnum::URL, ], ], ];
贡献
想要贡献?所有贡献都欢迎。阅读贡献指南。
问题
如果您有任何问题,请在@sandro_m_m上发推文或打开一个问题。
许可
本项目采用 MIT 许可证 - 有关详细信息,请参阅LICENSE 文件
**~ 分享就是关爱 ~**