验证器
通用验证条件,传入回调进行验证
该注解可以写在类、属性、方法上。
参数:
是验证回调,支持:
"is_int"
、"XXX::check"
、{@Inject("BeanName"), "methodName"}
{"$this", "methodName"}
指定当前对象中的方法,但Http验证器中无法使用。- 方法必须是
public
或protected
。
args
是回调方法参数,例子:
class TestValidate
{
public $abc = 'imi niubi!';
/**
* @AutoValidation
* @Condition(name="argName", @callable({"$this", "validate"}), args={"{:value}", "{:data}", "{name}", "{:data.a}", {":data.$this.abc"}})
*/
public function test($a, $b)
{
}
/**
* 本方法参数,由 @Condition 的 args 决定
* $value 是当前验证参数对应的值,也就是 test() 方法中,$a 参数值
* $data 是集合了 test() 方法中所有参数的数组
* 你可以用 $data['b'] 获取 $b 参数值
* $a 就是指定传入 test() 方法中 $a 参数值
* $vvv 就是指定 test() 方法所在类对象中的 $abc 属性值
*/
public function validate($value, $data, $name, $a, $vvv)
{
var_dump($value, $data, $name, $a, $vvv);
return true;
}
}
inverseResult
参数为true
时,会对验证回调方法结果取反后,判断是否为true
message
是验证失败的消息,可以将{name}
形式的注解参数值代入,也可以使用{:value}
代入验证值。
exception
和exCode
可以设定验证失败时抛出的异常类及异常编码,默认为\InvalidArgumentException
类。
除了callable
和args
以外,其它参数都可以作为其它验证条件注解(如:@Required
等)的参数
@Required
判断值是否存在
@Text
文本验证
必须>=6位长度,最长不限制:
@Text(min=6)
长度必须>=6 && <=12:
@Text(min=6, max=12)
@Integer
整数验证
验证必须为整数:
@Integer
验证必须为>=1024的整数:
@Integer(max=1024)
验证必须为>=1 && <=10的整数:
@Integer(min=1, max=10)
小数验证
验证必须为小数:
@Decimal
验证必须为>=10.24的小数:
@Decimal(min=10.24)
验证必须为<=10.24的小数:
@Decimal(max=10.24)
验证必须为>=1 && <=10.24的小数:
@Decimal(min=1, max=10.24)
@Number
数值验证,允许是整数或者小数
验证必须为数值:
@Decimal
验证必须为>=10.24的数值:
@Decimal(min=10.24)
验证必须为<=10.24的数值:
验证必须为>=1 && <=10.24的数值:
@Decimal(min=1, max=10.24)
传入
1
,结果为true
传入
1.0
,结果为true
@InList
列表验证,判断值是否存在于列表中
@InList(list={1, 2, 3})
相当于:
@Compare
比较验证注解
@Compare(name="参数名", value="被比较值", operation="比较符,如:==")
value
可以直接传值,也可以配合 @ValidateValue
注解使用。
operation
允许使用:==、!=、===、!==、<、<=、>、>=
指定验证时的值注解
@Compare(name="id", value=@ValidateValue("{:data.id}"), operation="==")
@InEnum
用于验证值是否存在于枚举列表中
@InEnum(name="type", enum="EnumClass")
注解:@AutoValidation
验证类属性
imi 支持在类、属性上使用 @AutoValidation
注解,当构造方法执行完毕后,触发验证。验证失败抛出异常。
如下代码,写在类上的注解以及属性上的注解,都因为加了@AutoValidation
注解,所以在构造方法执行完成后,会自动进行验证,验证失败则抛出异常。
/**
* @Bean("ValidatorTest")
*
* @AutoValidation
*
*
* @InList(name="in", list={1, 2, 3}, message="{:value} 不在列表内")
* @Integer(name="int", min=0, max=100, message="{:value} 不符合大于等于{min}且小于等于{max}")
* @Required(name="required", message="{name}为必须参数")
* @Number(name="number", min=0.01, max=999.99, accuracy=2, message="数值必须大于等于{min},小于等于{max},小数点最多保留{accuracy}位小数,当前值为{:value}")
* @Text(name="text", min=6, max=12, message="{name}参数长度必须>={min} && <={max}")
* @Condition(name="my", callable="\ImiDemo\HttpDemo\MainServer\Validator\Test::myValidate", args={"{:value}"}, message="{name}值必须为1")
*/
class Test
{
/**
* @Decimal(min=-0.01, max=999.99, accuracy=2, message="小数必须大于等于{min},小于等于{max},小数点最多保留{accuracy}位小数,当前值为{:value}")
*
* @var float
*/
public function __construct($data = [], $rules = null)
{
foreach($data as $name => $value)
{
$this->$name = $value;
}
}
public static function myValidate($value)
{
return 1 == $value;
}
}
验证方法参数
在 imi 中,如果你在方法上使用 @AutoValidation
注解,当方法被调用前,会触发验证操作,验证失败则抛出异常。验证的参数是传入方法的参数,如下代码,验证通过则进入方法体中,验证失败会抛出异常。
你也可以自己定义一个专门用于验证的类,将数据传入该类,手动调用验证方法。
/**
* @Bean("ValidatorTest")
*
* @InList(name="in", list={1, 2, 3}, message="{:value} 不在列表内")
* @Integer(name="int", min=0, max=100, message="{:value} 不符合大于等于{min}且小于等于{max}")
* @Required(name="required", message="{name}为必须参数")
* @Number(name="number", min=0.01, max=999.99, accuracy=2, message="数值必须大于等于{min},小于等于{max},小数点最多保留{accuracy}位小数,当前值为{:value}")
* @Text(name="text", min=6, max=12, message="{name}参数长度必须>={min} && <={max}")
* @Condition(name="my", callable="\ImiDemo\HttpDemo\MainServer\Validator\Test::myValidate", args={"{:value}"}, message="{name}值必须为1")
*/
class Test extends Validator
{
/**
* @Decimal(min=-0.01, max=999.99, accuracy=2, message="小数必须大于等于{min},小于等于{max},小数点最多保留{accuracy}位小数,当前值为{:value}")
*
* @var float
*/
public $decimal;
public function __construct($data = [], $rules = null)
{
parent::__construct($data, $rules);
foreach($data as $name => $value)
{
$this->$name = $value;
}
}
public static function myValidate($value)
{
return 1 == $value;
}
}
使用代码示例: