htmlburger / carbon-validator
作为独立库实现的基类验证器。受 Laravel 验证模块启发。
This package is auto-updated.
Last update: 2024-08-29 04:39:59 UTC
README
PHP 输入数据验证库。
<?php
$validator = new Carbon_Validator($_POST, array(
'name' => 'required',
'email' => 'required|email',
'message' => 'string_min_length:15|string_max_length:255'
));
if ($validator->fails()) {
$errors = $validator->get_errors();
} else {
send_mail_notification();
header('Location: ?success');
}
?>
- 通过提交输入数据和验证规则来创建新对象
- 输入数据应该是类似于
$_POST
的关联数组。 - 验证规则是另一个关联数组,其中键是字段名,值是与该字段相关的所有规则。
- 我们可以通过调用方法
$validator->fails()
或$validator->passes()
来检查数据是否有效。 - 我们可以通过
$validator->get_errors()
从验证器中提取自动生成的错误列表。 - 我们可以为特定字段和规则提交特定错误(以下为示例)
规则定义
每个字段都与一组验证规则相关联。它可以以字符串或数组的形式提交。当规则作为字符串提交时,它们通过管道符号(|
)分隔
<?php
$validator = new Carbon_Validator($_POST, array(
// The "customer_email" field is required and must be valid email
'customer_email' => 'required|email'
));
?>
当作为数组提交时,它必须按以下方式数字索引
<?php
$validator = new Carbon_Validator($_POST, array(
'email' => array('required', 'email')
));
?>
每条规则本身由以下组成
- 名称(例如
string_min_length
) - 与名称分隔的参数(例如
:15
来自string_min_length:15
)
可用的验证规则
Carbon_Validator
随带一些验证规则包。要加载包,请使用以下静态方法
Carbon_Validator::load_package('wordpress');
包 generic
(默认加载)
required
- 字段必须有某种值in:value1,value2,value3,...
- 字段必须具有规则参数中提供的值之一email
- 有效的电子邮件地址(在括号内使用 PHP 的filter_var
函数)regex:/regex_body/i
- 使用提供的正则表达式验证字段的值numeric
- 使用 PHP 的内置is_numeric
函数通过值string_min_length:value
- 指定字段的最低长度string_max_length:value
- 指定字段的最高长度numeric_min:value
- 指定字段的最低数值numeric_max:value
- 指定字段的最高数值url
- 有效的 URL 地址(在括号内使用 PHP 的filter_var
函数)file:ext,ext2
- 确保上传了具有指定类型的文件。不检查文件的扩展名,而是检查其 MIME 类型filesize:2M
- 确保上传了小于指定大小(2MB)的文件。接受带有后缀 K(KB)的大小email_exists
- 检查是否存在具有该电子邮件地址的用户user_exists
- 检查是否存在具有该用户名的用户
包 wordpress
wp_nonce:action_name
- 通过wp_verify_nonce()
验证字段wp_post:post_type1,post_type2
- 通过get_post()
验证帖子ID
。可以选择添加 1 或多个帖子类型作为验证帖子的要求wp_user:role_or_capability1,role_or_capability2
- 通过get_userdata()
验证用户ID
。可以选择添加 1 或多个角色/权限作为验证用户的要求
存储/加载
您可以将 Carbon_Validator 实例保存并稍后加载。
Carbon_Validator::store('some_id', $validator);
$validator = Carbon_Validator::load('some_id');
示例
functions.php
<?php
add_action('template_redirect', 'crb_handle_contact_form');
function crb_handle_contact_form() {
$is_contact_request = isset($_POST['action']) && $_POST['action'] === 'contact_form';
if (!$is_contact_request) {
return false;
}
$validator = new Carbon_Validator($_POST, array(
"contact_name" => "required",
"contact_email" => "required|email",
"contact_message" => "required",
));
// Store the validator, so we can use it in the front-end
Carbon_Validator::store('contact_form' , $validator);
$success = $validator->passes();
if ($success) {
// Send email notification, or whatever.
}
}
?>
templates/contact.php
<?php
// Load the validator that was previously stored in functions.php
$validator = Carbon_Validator::load('contact_form');
// Check if the request is successful, otherwise output the errors
if ($validator): ?>
<?php if ($validator->passes()): ?>
<p class="alert alert-success"><?php _e('Your message has been sent.', 'crb'); ?></p>
<?php elseif ($errors = $validator->get_errors()): ?>
<div class="alert alert-danger">
<ul>
<?php foreach ($errors as $error): ?>
<li><?php echo esc_html($error) ?></li>
<?php endforeach ?>
</ul>
</div>
<?php endif ?>
<?php endif; ?>
自定义错误消息
自动生成的验证错误在大多数情况下都能工作。然而,有时需要添加自定义错误信息。这可以通过类 Validator
构造函数的第三个参数来实现。
<?php
$rules = array(
'name' => 'required',
'email' => 'required|email',
'message' => 'string_min_length:15|string_max_length:255'
);
$error_messages = array(
'name.required' => 'We need your full name in order to contact you later. ',
'message.string_min_length' => 'Your message is too short -- please enter more than 15 characters. ',
'message.string_max_length' => 'Your message is too long -- please enter less than 255 characters. '
);
$validator = new Carbon_Validator($_POST, $rules, $error_messages);
?>
全局默认错误信息
要为所有 Carbon_Validator
实例添加或重写一条消息,可以使用以下静态方法。
// Carbon_Validator::register_default_error_message($rule, $message);
Carbon_Validator::register_default_error_message('required', 'You should really fill out the "%1$s" field.');
如果使用它,%1$s
将被替换为要验证的字段的用户友好名称。
此方法还允许您将消息传递给翻译函数(例如 WordPress 中的 __()
、_e()
等)。
自定义验证规则
内置规则不一定足够。当需要进行更具体的验证时,我们可以做如下操作:
<?php
/**
* Validates IP address and makes sure that it matches format "192.168.XXX.XXX"
*/
function validate_internal_ip_address($value) {
if (!filter_var($value, FILTER_VALIDATE_IP)) {
return false;
}
$pieces = explode('.', $value);
if (count($pieces) !== 4) {
return false;
}
if (intval($pieces[0]) !== 192 || intval($pieces[1]) !== 168) {
return false;
}
return true;
}
// Bind the "internal_ip" validation rule to the "validate_internal_ip_address" callback function
Carbon_Validator::extend('internal_ip', 'validate_internal_ip_address');
# $_POST looks like:
# array(
# "name" => "John Doe",
# "ip-address" => "192.168.2.54",
# );
$rules = array(
'ip-address' => 'required|internal_ip',
);
$messages = array(
'ip-address.internal_ip' => 'Please enter valid internal IP addres. ',
);
$validator = new Carbon_Validator($_POST, $rules, $messages);
?>
扩展是通过静态方法 Carbon_Validator::extend($rule_name, $callback)
实现的。扩展后,$rule_name
可以在表单的验证规则中使用。
可以通过抛出特殊异常 Carbon_Validator_ValidationError
将错误传递给 Carbon_Validator
类。
自定义验证规则回调
传递给回调的参数包括
function my_custom_validation_rule_callback($value, $parameters, $field, $validator_instance) { };
$value
- 要验证的值$parameters
- 作为规则参数传入的值数组(以逗号分隔的列表)$field
- 要验证的字段$validator_instance
- 调用此回调的验证器实例引用
文件验证
<?php
$data = array_merge($_POST, array(
'avatar' => Carbon_FileUpload::make($_FILES['avatar'])
));
$validator = new Carbon_Validator($data, array(
'name' => 'required',
'email' => 'required|email',
'message' => 'required',
'avatar' => 'file:jpg|filesize:1M',
));
?>
文件验证的现有扩展可以在 validator/mime-types.php
中找到。
数组验证
当您在 $_POST
中有数组时,可以使用方括号来指定要验证的特定元素,如下所示:
<?php
$input = array(
'user' => array(
'first_name' => 'John',
'last_name' => 'Doe',
'email' => 'johndoe@example.com',
'address' => array(
'street' => array(
'number' => "123"
)
)
)
);
$validator = new Carbon_Validator($input, array(
'user[first_name]' => 'required',
'user[last_name]' => 'required|string_min_length:2',
'user[email]' => 'email',
'user[address][street][number]' => 'required',
));
var_dump($validator->passes());
?>
类的设计借鉴了 Laravel 库。