wijoc/validify-mi

PHP 和 WordPress 的独立验证。

v0.1.0 2024-09-03 00:54 UTC

This package is not auto-updated.

Last update: 2024-10-01 01:18:47 UTC


README

与过程式 PHP 和 WordPress 兼容的独立 PHP 验证。该项目提供了一组验证规则,以简化项目中数据验证,并针对 WordPress 项目提供特定数据清理。该项目深受 Laravel 验证和 rakit/validation 的影响,起源于个人需求,目前仍处于测试开发阶段。所有输入都受到高度重视。

目录

功能

  • 简单的语法
  • 支持多个验证规则
  • 支持自定义错误消息
  • 兼容过程式 PHP 和 WordPress
  • 支持 WordPress 清理
  • 支持嵌套验证

安装

您可以通过 Composer 安装库

composer  require  wijoc/validify-mi

使用

以下是使用 ::make 函数使用验证的方式。Validator::make 有 4 个参数

  1. 要验证的输入。
  2. 验证规则。
  3. 自定义验证消息。
  4. 清理规则。(目前仅适用于 WordPress 项目)所有参数应为数组。
<?php
require 'vendor/autoload.php';

use Wijoc\ValidifyMI\Validator;
$input = [
  'email' => 'user@example.com',
  'age' => 25
];

$rules = [
  'email' => ['required', 'email'],
  'age' => ['required', 'numeric']
];

$message = [
  'email.required' => "Email is required!",
  'email.email' => "Email is invalid!",
  'age.required' => "Age is required!",
  'age.numeric' => "Age must be numeric!"
];

/** Create validator
* * You can add sanitizer as 4th arguments
* * (for now it's limited to wordpress sanitize)
*/
$validator = Validator::make($input, $rules, $message);

if ($validator->fails()) {
  /** Validation failed */
  print_r($validator->errors('all'));

  /** Get first error */
  $validator->errors()->firstOfAll();
} else {
  /** Validation passed */
  echo "Validation successful!";

  /** get validated data */
  $validated = $validator->validate();
}

您还可以使用以下方式验证嵌套输入

<?php
require 'vendor/autoload.php';

use Wijoc\ValidifyMI\Validator;
$input = [
  'email' => 'user@example.com',
  'age' => 25,
  'phoneNumber' => [
    '123456789',
    '987654321'
  ],
  'socialMedia' => [
    'facebook' => 'https://facebook.com',
    'twitter' => 'https://twitter.com'
  ],
  'address' => [
    [
      'city' => 'Jakarta',
      'province' => 'DKI Jakarta',
      'postalCode' => '123'
    ]
  ]
];

$rules = [
  'email' => ['required', 'email'],
  'age' => ['required', 'numeric'],
  'phoneNumber' => ['min:1'],
  'phoneNumber.*' => ['numeric'],
  'socialMedia.facebook' => ['required'],
  'address.*.postalCode' => ['required', 'numeric'],
];

$message = [
  'email.required' => "Email is required!",
  'email.email' => "Email is invalid!",
  'age.required' => "Age is required!",
  'age.numeric' => "Age must be numeric!"
];

/** Create validator
* * You can add sanitizer as 4th arguments
* * (for now it's limited to wordpress sanitize)
*/
$validator = Validator::make($input, $rules, $message);

if ($validator->fails()) {
  /** Validation failed */
  print_r($validator->errors('all'));
} else {
  /** Validation passed */
  echo "Validation successful!";
}

说明

首先,我们准备所有必要的参数来初始化验证器。

  1. 要验证的输入
/** Input Value to validate */
$input = [
  'email' => 'user@example.com',
  'age' => 25
];
  1. 验证规则
/** Validation Rule */
$rules = [
  'email' => ['required', 'email'],
  'age' => ['required', 'numeric']
];
  1. 自定义验证消息
$message = [
  'email.required' => "Email is required!",
  'email.email' => "Email is invalid!",
  'age.required' => "Age is required!",
  'age.numeric' => "Age must be numeric!"
];

然后,我们使用准备好的参数使用 Validator::make() 函数初始化它。

/** Create validator
* * You can add sanitizer as 4th arguments
* * (for now it's limited to wordpress sanitize)
*/
$validator = Validator::make($input, $rules, $message);

之后,我们可以使用 validate()fails() 函数检查输入是否已验证:如果所有输入都经过验证,则 validate() 将返回 true,如果没有经过验证,则返回 false

/** Using validate() function */
$validator->validate()

或者另一方面,fails() 将在输入验证通过时返回 false,在所有输入都没有验证时返回 true

/** Using fails function */
$validator->fails()

示例

if ($validator->fails()) {
  /** Validation failed */
  print_r($validator->errors('all'));
} else {
  /** Validation passed */
  echo "Validation successful!";
}

如果数据未通过验证,我们可以使用 errors('all') 函数检索所有错误。'all' 参数是必需的,以便获取所有错误。

if ($validator->fails()) {
  /** Validation failed */
  print_r($validator->errors('all'));
} else {
  /** Validation passed */
  echo "Validation successful!";
}

或者,如果您只想获取第一个错误,您可以在 errors() 函数之上使用 firstOfAll() 方法。请注意:如果您使用 firstOfAll(),则不需要将 'all' 参数添加到 errors() 函数中。

if ($validator->fails()) {
  /** Validation failed */
  print_r($validator->errors()->firstOfAll());
  // print_r($validator->errors('all')->firstOfAll()); -> This will result an exception
} else {
  /** Validation passed */
  echo "Validation successful!";
}

最后,您可以使用 validated() 函数获取已验证的输入。如果所有数据都已验证,则 validated() 函数将返回输入数组,如果没有验证数据,则返回空数组。

if ($validator->fails()) {
  /** Validation failed */
  print_r($validator->errors()->firstOfAll());
  // print_r($validator->errors('all')->firstOfAll()); -> This will result an exception
} else {
  /** Validation passed */
  echo "Validation successful!";

  /** get validated */
  $validated = $validator->validated();
  print_r($validated);
}

此外,如果您正在处理 WordPress 项目,您可以使用清理功能。有关清理功能的更多信息,请参阅此处

验证规则

  • 必需

    检查给定数据是否为空。

    $rules = [
      'input' => ['required']
    ];
  • 电子邮件

    检查给定数据是否为有效的电子邮件地址,使用 PHP FILTER_VALIDATE_EMAIL

    $rules = [
      'input' => ['email']
    ];
  • URL

    使用php FILTER_VALIDATE_URL 检查给定数据是否为有效的URL。

    $rules = [
      'input' => ['url']
    ];
  • 数字

    检查给定数据是否为数字。

    $rules = [
      'input' => ['numeric']
    ];
  • 最大值

    检查数组的最大元素或字符串的总字符数。数值将被视为字符串。使用 大于大于等于比较数字 验证数值。

    $rules = [
      'input' => ['max:9']
    ];
  • 最小值

    检查数组的最小元素或字符串的总字符数。数值将被视为字符串。使用 小于小于等于比较数字 验证数值。

    $rules = [
      'input' => ['min:9']
    ];
  • 大于

    检查值是否大于给定参数。值必须是数值。

    $rules = [
      'input' => ['greater_than:9']
    ];

    $rules = [
      'input' => ['gt:9']
    ];
  • 大于等于

    检查值是否大于或等于给定参数。值必须是数值。

    $rules = [
      'input' => ['greater_than_equal:9']
    ];

    $rules = [
      'input' => ['gte:9']
    ];
  • 小于

    检查值是否小于给定参数。值必须是数值。

    $rules = [
      'input' => ['less_than:9']
    ];

    $rules = [
      'input' => ['lt:9']
    ];
  • 小于等于

    检查值是否小于或等于给定参数。值必须是数值。

    $rules = [
      'input' => ['less_than_equal:9']
    ];

    $rules = [
      'input' => ['lte:9']
    ];
  • 比较数字

    通过比较与给定参数检查值。值必须是数值。

    $rules = [
      'input' => ['compare_number:{operator},{parameter to compare}']
    ];

    示例

    $rules = [
      'input' => ['compare_number:>,9']
    ];
  • 日期

    检查值是否为日期,并且与参数格式相同。

    $rules = [
      'input' => ['date:{date format}']
    ];

    示例

    $rules = [
      'input' => ['date:Y-m-d H:i:s']
    ];
  • 日期大于

    检查值是否为晚于给定参数的日期。参数可以是其他输入。

    $rules = [
      'input' => ['date_more_than:{date or request field},{date format}']
    ];

    示例

    $rules = [
      'input' => ['date_more_than:2024-12-01 01:59:59, Y-m-d H:i:s']
    ];

    $request = [
      'inputToCompare' => '2024-01-30',
      'input' => '2024-12-31',
    ];
    $rules = [
      'input' => ['date_more_than:inputToCompare, Y-m-d']
    ];
  • 日期小于

    检查值是否为早于给定参数的日期。参数可以是其他输入。

    $rules = [
      'input' => ['date_less_than:{date or request field},{date format}']
    ];

    示例

    $rules = [
      'input' => ['date_less_than:2024-12-01 01:59:59,Y-m-d H:i:s']
    ];

    $request = [
      'inputToCompare' => '2024-01-30',
      'input' => '2024-12-31',
    ];
    
    $rules = [
      'input' => ['date_less_than:inputToCompare,Y-m-d']
    ];
  • 日期介于

    检查值是否为介于给定参数之间的日期。参数可以是另一个请求输入。

    $rules = [
      'input' => ['date_between:{start date or request field},{end date or request field},{date format}']
    ];

    示例

    $rules = [
      'input' => ['date_between:2024-12-01 01:59:59,2024-12-31 01:59:59,Y-m-d H:i:s']
    ];

    $request = [
      'inputStart' => '2024-01-01',
      'inputEnd' => '2024-01-30',
      'input' => '2024-12-31',
    ];
    
    $rules = [
      'input' => ['date_between:inputStart,inputEnd,Y-m-d']
    ];
  • 存在

  • 不存在

  • 匹配

    检查值是否与给定参数匹配/完全相同。参数必须是另一个请求输入。

    $rule = [
      'input' => ['match:{request field}'];
    ];

    示例

    $request = [
      'inputToCompare' => 'value to compare',
      'input' => 'value input'
    ];
    $rule = [
      'input' => ['match:inputToCompare'];
    ];
  • 不匹配

    检查值是否不匹配或不完全相同于给定参数。参数必须是另一个请求输入。

    $rule = [
      'input' => ['not_match:{request field}'];
    ];

    示例

    $request = [
      'inputToCompare' => 'value to compare',
      'input' => 'value input'
    ];
    $rule = [
      'input' => ['not_match:inputToCompare'];
    ];
  • 文件

    检查值是否为文件输入。

    $rule = [
      'input' => ['files'];
    ];

    $rule = [
      'input' => ['file'];
    ];

    $rule = [
      'input' => ['is_file'];
    ];
  • 文件最大大小

    检查输入文件大小不小于给定参数。

    $rule = [
      'input' => ['max_file_size:{size in KB}'];
    ];

    示例

    $rule = [
      'input' => ['max_file_size:20'];
    ];
  • MIME

    检查输入文件的MIME类型是否为给定参数之一。参数可以用逗号(“,”)分割为多个。

    $rule = [
      'input' => ['mime:{mime type}'];
    ];

    示例

    $rule = [
      'input' => ['mime:image/png,image/jpeg,application/pdf'];
    ];
  • 检查输入值是否为给定参数之一。参数可以用逗号(“,”)分割为多个。

    $rule = [
      'input' => ['in:value1,value2'];
    ];
  • 正则表达式

    检查输入值是否匹配正则表达式模式。

    $rule = [
      'input' => ['regex:^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*()_+])(?=\S+$).*'];
    ];

清理

当前仅适用于WordPress项目,因此它使用WordPress的默认清理函数。用法

<?php
require 'vendor/autoload.php';

use Wijoc\ValidifyMI\Validator;
$input = [
  'email' => 'user@example.com',
  'age' => 25,
  'phoneNumber' => [
    '123456789',
    '987654321'
  ],
  'socialMedia' => [
    'facebook' => 'https://facebook.com',
    'twitter' => 'https://twitter.com'
  ],
  'address' => [
    [
      'city' => 'Jakarta',
      'province' => 'DKI Jakarta',
      'postalCode' => '123'
    ]
  ]
];

$rules = [
  'email' => ['required', 'email'],
  'age' => ['required', 'numeric'],
  'phoneNumber' => ['min:1'],
  'phoneNumber.*' => ['numeric'],
  'socialMedia.facebook' => ['required'],
  'address.*.postalCode' => ['required', 'numeric'],
];

$message = [
  'email.required' => "Email is required!",
  'email.email' => "Email is invalid!",
  'age.required' => "Age is required!",
  'age.numeric' => "Age must be numeric!"
];

$sanitizer = [
  'email' => 'email'
  'age' => 'text'
  'phoneNumber.*' => 'text',
  'socialMedia.facebook' => 'text',
  'address.*.province' => 'kses'
];

/** Create validator
* * You can add sanitizer as 4th arguments
* * (for now it's limited to wordpress sanitize)
*/
$validator = Validator::make($input, $rules, $message, $sanitizer);

if ($validator->fails()) {
  /** Validation failed */
  print_r($validator->errors('all'));
} else {
  /** get validated data */
  $validated = $validator->validated();

  /** get sanitized data */
  $sanitized = $validator->sanitized();
}
  • 电子邮件

此规则使用wordpress sanitize_email() 函数。

$sanitizer = [
  'input' => 'email'
];
  • 文本区域

此规则使用wordpress sanitize_textarea_field() 函数。

$sanitizer = [
  'input' => 'textarea'
];
  • 文本

此规则使用wordpress sanitize_text_field() 函数。

$sanitizer = [
  'input' => 'text'
];
  • kses

此规则使用wordpress wp_kses() 函数。

$sanitizer = [
  'input' => 'kses'
];
  • ksespost

此规则使用wordpress wp_kses_post() 函数。

$sanitizer = [
  'input' => 'ksespost'
];