SW-X内置的验证规则可能并不足够实际开发使用,
而Validate
验证器是基于事件机制实现,支持开发者扩展验证规则。
提示:扩展规则,建议(并不强制)统一存放在/box/event/validate/
目录下。
提示:扩展规则,无需继承任何基类,但需要按固定格式,实现规则入口方法。
所有自定义规则,必须在/box/validate.php
文件中进行手动注册之后,才能正常使用。
注册规则,依赖\x\validate\Event::listen()
方法。
该方法支持参数如下:
string $rule_name
string|array $class
run
string $message
null
例如下面,注册一条名为qq
的规则,处理类为\box\event\validate\qq
,方法run()
:
use \x\validate\Event;
// 字符名别名替换,可以用{:preset},也可以用{字段名}做占位符
// 如果是有额外参数的,按参数顺序,可以用{0-N}来做占位符
// 如果是默认run的,可以用字符串
Event::listen('qq', '\box\event\validate\qq', '{:preset} QQ号不正确,只能是 {qq} 其中一个');
// 当然也可以手动设置处理方法名
Event::listen('qq', ['\box\event\validate\qq', 'run'], '{:preset} QQ号不正确,只能是 {qq} 其中一个');
所有自定义规则,所创建的处理方法,都必须注意以下几点:
public
权限;static
静态属性;($data, $param, $rule=null)
3个参数;bool
类型,true
表示验证通过,false
表示验证不通过。
下面,一起来创建上面示例中的qq
规则,
代码地址为:/box/event/validate/qq.php
namespace box\event\validate;
class qq {
/**
* 规则入口方法
* @todo 无
* @author 小黄牛
* @version v2.5.6 + 2021-09-15
* @deprecated 暂不启用
* @global 无
* @param array $data 完整表单
* @param mixed $param 参数值
* @param string $rule :后参数
* @return bool
*/
public static function run($data, $param, $rule=null) {
// 系统不会帮忙切割$rule参数中的,逗号,需要自行切换
// 如果担心参数中有多余空格,也需要自行删除
$array = explode(',', str_replace(' ', '', $rule));
return in_array($param, $array);
}
}
现在,这个qq
规则就可以直接使用了,下面使用单条数据验证进行调用演示:
$Validate = new \x\Validate();
$Validate->field('user_qq')->alias('会员QQ号')->rule('require|qq:1731223728, 1765321014, 3455435050');
$data = [
'user_qq' => '12344577'
];
if ($ValiUser->fails($data)) {
// 打印失败原因
var_dump($Validate->errors());
}