beegovalidation
相信接触过后端开发的都使⽤过表单设计⼯具,这⾥就分析⼀下beego表单验证⼯具validation是如何⼯作的
import(
"/astaxie/beego/validation"
"log"
)
typeUrstruct{
Namestring
Ageint
}
funcmain(){
u:=Ur{"man",40}
valid:=tion{}
ed(,"name")
e(,15,"nameMax")
(,0,140,"age")
ors(){
//validationdoesnotpass
//printinvalidmessage
for_,err:={
n(,e)
}
}
//orulikethis
ifv:=(,140,"ageMax");!{
n(,e)
}
}
moreinfo:/docs/mvc/controller/
这是官⽅给的⼀段⽰例代码
可以看到⾸先这⾥初始化了⼀个valid结构体
并调⽤了其下的相应的⽅法,这⾥就以最简单的Required为例讲⼀讲valid是如何验证数据的
//RequiredTestthattheargumentisnon-nilandnon-empty(ifstringorlist)
func(v*Validation)Required(objinterface{},keystring)*Result{
(Required{key},obj)
}
这是源码⾥的valid⽅法,可以看到它属于Validation对象,并且调⽤了validation的apply⽅法.
typeValidationstruct{
//ifthisfieldttrue,instructtagvalid
//ifthestructfieldvaleimpty
//itwillskipthovalidfunctions,eCanSkipFuncs
RequiredFirstbool
Errors[]*Error
ErrorsMapmap[string][]*Error
}
//接⼝
//Validatorinterface
typeValidatorinterface{
IsSatisfied(interface{})bool
DefaultMessage()string
GetKey()string
GetLimitValue()interface{}
}
//结构体对象
//Requiredstruct
typeRequiredstruct{
Keystring
}
//这⾥传⼊了⼀个Validator的对象,但上⽂调⽤的时传⼊的时Required对象,
//说明有⼀个⼀定是接⼝,并且另⼀个实现了这个接⼝,我把他们放在上⾯
func(v*Validation)apply(chkValidator,objinterface{})*Result{
ifnil==obj{
sfied(obj){
return&Result{Ok:true}
}
}(obj).Kind()=={
f(obj).IsNil(){
sfied(nil){
return&Result{Ok:true}
}
}el{
sfied(f(obj).Elem().Interface()){
return&Result{Ok:true}
}
}
}sfied(obj){
return&Result{Ok:true}
}
//下⾯是返回错误信息的了
//可以看到主要的⼯作⽅法是Validator下的IsSatisfied⽅法
--------------------------------------------------------------------------------------
/*
·········
*/
//Alsoreturnitintheresult.
return&Result{
Ok:fal,
Error:err,
}
}
func(rRequired)IsSatisfied(objinterface{})bool{
ifobj==nil{
returnfal
}
ifstr,ok:=obj.(string);ok{
returnlen(ace(str))>0
}
if_,ok:=obj.(bool);ok{
returntrue
}
ifi,ok:=obj.(int);ok{
returni!=0
}
ifi,ok:=obj.(uint);ok{
returni!=0
}
ifi,ok:=obj.(int8);ok{
returni!=0
}
ifi,ok:=obj.(uint8);ok{
returni!=0
/*
······省略
*/
v:=f(obj)
()=={
()>0
}
returntrue
}
可以看到这⾥先使⽤类型断⾔判断传⼊的空接⼝类型,再判断其值是否设置了。
其他诸如
//MinTestthattheobjisgreaterthanminifobj'stypeisint
func(v*Validation)Min(objinterface{},minint,keystring)*Result{
(Min{min,key},obj)
}
//MaxTestthattheobjislessthanmaxifobj'stypeisint
func(v*Validation)Max(objinterface{},maxint,keystring)*Result{
(Max{max,key},obj)
}
//RangeTestthattheobjisbetweenmniandmaxifobj'stypeisint
func(v*Validation)Range(objinterface{},min,maxint,keystring)*Result{
(Range{Min{Min:min},Max{Max:max},key},obj)
}
Min,Max,Rang等也是如此
⽽类似IP,Email,Phone则是使⽤相应的正则匹配但是执⾏流程也是这样。
func(mMin)IsSatisfied(objinterface{})bool{
varvint
switchobj.(type){
caint64:
ifwordsize==32{
returnfal
}
v=int(obj.(int64))
caint:
v=obj.(int)
caint32:
v=int(obj.(int32))
caint16:
v=int(obj.(int16))
caint8:
v=int(obj.(int8))
default:
returnfal
}
returnv>=
}
但是结构体⽐较特殊,是单独写的验证函数,有兴趣可以⾃⼰去看看
本文发布于:2023-01-03 22:16:08,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/86862.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |