沙多米格尔/verum-php

PHP 服务端表单验证库


README

Verum PHP

License Latest Stable Version Dependents

Verum PHP

Verum PHP 是一个 PHP 的服务端验证库,可以轻松地验证数组(支持文件)。它包含自定义错误消息、规则、内置翻译,且无依赖。

PHP 服务端验证库

  • 验证数组(支持文件)
  • 自定义错误消息
  • 自定义规则
  • 内置翻译
  • 无依赖

目录

  1. 入门
  2. 用法
  3. 自定义验证
  4. 可用规则
  5. 贡献
  6. 问题
  7. 许可

入门

安装

使用 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.entitle.ptdescription.endescription.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')]
    );
    // ...
}

可用规则

  1. alpha
  2. alpha_numeric
  3. between
  4. between_length
  5. boolean_value
  6. contains
  7. date
  8. email
  9. equals
  10. file_max_size
  11. file_mime_type
  12. float_number
  13. image_max_height
  14. image_max_width
  15. image_min_height
  16. image_min_width
  17. integer
  18. ip
  19. ipv4
  20. ipv6
  21. max
  22. max_length
  23. min
  24. min_length
  25. numeric
  26. regex
  27. required
  28. slug
  29. 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'],
        ],
    ],
];

email

检查值是否具有有效的电子邮件格式。

$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 文件

**~ 分享就是关爱 ~**