聲明:由于官方的 think-validate驗(yàn)證器 不兼容
PHP8.0
。所以這里重復(fù)造輪子
基于PHP7.4 + 的Validate實(shí)現(xiàn)?;赥hinkPHP6修改的可用于 webman 的通用validate數(shù)據(jù)驗(yàn)證器。
項(xiàng)目地址:https://github.com/Tinywan/casbin
composer require tinywan/validate
<?php
namespace app\index\validate;
use Tinywan\Validate\Validate;
class UserValidate extends Validate
{
protected $rule = [
'name' => 'require|max:25',
'age' => 'require|number|between:1,120',
'email' => 'require|email'
];
protected $message = [
'name.require' => '名稱必須',
'name.max' => '名稱最多不能超過(guò)25個(gè)字符',
'age.require' => '年齡必須是數(shù)字',
'age.number' => '年齡必須是數(shù)字',
'age.between' => '年齡只能在1-120之間',
'email.require' => '郵箱必須是數(shù)字',
'email.email' => '郵箱格式錯(cuò)誤'
];
}
驗(yàn)證器調(diào)用代碼如下:
$data = [
'name' => 'Tinywan',
'age' => 24,
'email' => 'Tinywan@163.com'
];
$validate = new \app\index\validate\UserValidate;
if (!$validate->check($data)) {
var_dump($validate->getError());
}
自定義函數(shù) functions.php
添加validate()
函數(shù)
/**
* @desc 驗(yàn)證器助手函數(shù)
* @param array $data 數(shù)據(jù)
* @param string|array $validate 驗(yàn)證器類名或者驗(yàn)證規(guī)則數(shù)組
* @param array $message 錯(cuò)誤提示信息
* @param bool $batch 是否批量驗(yàn)證
* @param bool $failException 是否拋出異常
* @return bool
* @author Tinywan(ShaoBo Wan)
*/
function validate(array $data, $validate = '', array $message = [], bool $batch = false, bool $failException = true)
{
if (is_array($validate)) {
$v = new \Tinywan\Validate\Validate();
$v->rule($validate);
} else {
if (strpos($validate, '.')) {
[$validate, $scene] = explode('.', $validate);
}
$class = false !== strpos($validate, '\\') ? $validate : $validate;
$v = new $class();
if (!empty($scene)) {
$v->scene($scene);
}
}
return $v->message($message)->batch($batch)->failException($failException)->check($data);
}
驗(yàn)證器調(diào)用代碼如下:
$data = [
'name' => 'Tinywan',
'age' => 24,
'email' => 'Tinywan@163.com'
];
validate($data, \app\index\validate\UserValidate::class . '.issue');
驗(yàn)證錯(cuò)誤會(huì)自動(dòng)拋出異常
更多用法可以參考6.0完全開(kāi)發(fā)手冊(cè)的驗(yàn)證章節(jié)
@864328615 自己實(shí)現(xiàn)一下 就行了
public function unique($value, $rule, array $data = [], string $field = ''): bool
{
if (is_string($rule)) {
$rule = explode(',', $rule);
}
if (false !== strpos($rule[0], '\\')) {
// 指定模型類
$db = new $rule[0];
} else {
// 指定模型類
$className = "\\app\\model\\" . ucfirst($rule[0]);
$db = new $className;
}
$key = $rule[1] ?? $field;
$map = [];
if (strpos($key, '^')) {
// 支持多個(gè)字段驗(yàn)證
$fields = explode('^', $key);
foreach ($fields as $key) {
if (isset($data[$key])) {
$map[] = [$key, '=', $data[$key]];
}
}
} elseif (isset($data[$field])) {
$map[] = [$key, '=', $data[$field]];
}
$pk = !empty($rule[3]) ? $rule[3] : $db->getPk();
if (is_string($pk)) {
if (isset($rule[2])) {
$map[] = [$pk, '<>', $rule[2]];
} elseif (isset($data[$pk])) {
$map[] = [$pk, '<>', $data[$pk]];
}
}
if ($db->where($map)->field($pk)->find()) {
return false;
}
return true;
}
unique唯一驗(yàn)證報(bào)錯(cuò) Tinywan\Validate\Validate::unique(): Argument #2 ($data) must be of type array, string given