🚀 我的第二个webman插件webman/validate 验证插件

Tinywan

Webman Validate 插件

Total Downloads
Latest Stable Version

声明:由于官方的 think-validate验证器 不兼容 PHP8.0。所以这里重复造轮子

基于PHP7.4 + 的Validate实现。基于ThinkPHP6修改的可用于 webman 的通用validate数据验证器。

项目地址: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'     => '名称最多不能超过25个字符',
        'age.require'   => '年龄必须是数字',
        'age.number'   => '年龄必须是数字',
        'age.between'  => '年龄只能在1-120之间',
        'email.require'        => '邮箱必须是数字',
        'email.email'        => '邮箱格式错误'
    ];
}

验证器调用代码如下:

$data = [
    'name'  => 'Tinywan',
    'age'  => 24,
    'email' => 'Tinywan@163.com'
];
$validate = new \app\index\validate\UserValidate;

if (!$validate->check($data)) {
    var_dump($validate->getError());
}

助手函数(推荐)

自定义函数 functions.php 添加validate()函数

/**
 * @desc 验证器助手函数
 * @param array $data 数据
 * @param string|array $validate 验证器类名或者验证规则数组
 * @param array $message 错误提示信息
 * @param bool $batch 是否批量验证
 * @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);
}

验证器调用代码如下:

$data = [
    'name'  => 'Tinywan',
    'age'  => 24,
    'email' => 'Tinywan@163.com'
];
validate($data, \app\index\validate\UserValidate::class . '.issue');

验证错误会自动抛出异常

更多用法可以参考6.0完全开发手册的验证章节

2436 5 1
5个评论

864328615

unique唯一验证报错 Tinywan\Validate\Validate::unique(): Argument #2 ($data) must be of type array, string given

  • Tinywan 2022-02-26

    不推荐使用这个验证唯一性!为啥?不安全,这个唯一验证是是直接调用数据库查询的

  • 864328615 2022-02-26

    还有别的方式吗 大佬

  • 864328615 2022-02-26

    大佬你这个插件有点让人误解了是吗,我安装了think-validate 对php8是支持的啊

  • Tinywan 2022-02-26

    那你用think-validate就可以啦!

  • yzh52521 2022-02-28

    @864328615 自己实现一下 就行了

    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, '^')) {
                // 支持多个字段验证
                $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;
        }
1619443919

php73的用起来有啥问题不

864328615

现在的版本是不是支持了unique啊

TM

挺好用 感谢大佬

  • TM 2023-11-22

    刚更新php版本就遇到了tp验证器问题,刚好在社区找到大佬插件

  • Tinywan 2023-11-22

    哈哈!那就好

Leon

大佬,语言支持嘛?
我想在语言包里直接翻译过来但是不触发多语言呢

年代过于久远,无法发表评论

Tinywan

10990
积分
0
获赞数
0
粉丝数
2020-01-14 加入
🔝