http://www.yiichina.com/doc/guide/2.0/input-validation
https://www.yiichina.com/doc/guide/2.0/tutorial-core-validators(核心验证器Core Validators)
yii\base\Model::rules() 是验证规则
yii\base\Model::validate()是验证函数
利用25个核心验证器来验证输入是否合法。
25个核心验证器在两个地方:yii\validators\xxValidator.php 或者 yii\captcha\xxValidator.php
通常调用某个核心验证器,会调用它的别名,这个别名定义在 yii\validators\Validator.php里:
public static $builtInValidators = [
'boolean' => 'yii\validators\BooleanValidator',
'captcha' => 'yii\captcha\CaptchaValidator',
'compare' => 'yii\validators\CompareValidator',
'date' => 'yii\validators\DateValidator',
'datetime' => [
'class' => 'yii\validators\DateValidator',
'type' => DateValidator::TYPE_DATETIME,
],
'time' => [
'class' => 'yii\validators\DateValidator',
'type' => DateValidator::TYPE_TIME,
],
'default' => 'yii\validators\DefaultValueValidator',
'double' => 'yii\validators\NumberValidator',
'each' => 'yii\validators\EachValidator',
'email' => 'yii\validators\EmailValidator',
'exist' => 'yii\validators\ExistValidator',
'file' => 'yii\validators\FileValidator',
'filter' => 'yii\validators\FilterValidator',
'image' => 'yii\validators\ImageValidator',
'in' => 'yii\validators\RangeValidator',
'integer' => [
'class' => 'yii\validators\NumberValidator',
'integerOnly' => true,
],
'match' => 'yii\validators\RegularExpressionValidator',
'number' => 'yii\validators\NumberValidator',
'required' => 'yii\validators\RequiredValidator',
'safe' => 'yii\validators\SafeValidator',
'string' => 'yii\validators\StringValidator',
'trim' => [
'class' => 'yii\validators\FilterValidator',
'filter' => 'trim',
'skipOnArray' => true,
],
'unique' => 'yii\validators\UniqueValidator',
'url' => 'yii\validators\UrlValidator',
'ip' => 'yii\validators\IpValidator',
];
验证器中when和on的用法
class MyModel extwnds \yii\base\Model
{
const MY_SCENARIO = 'myscenario';
public function rules()
{
return [
[['name', 'email', 'subject', 'body'], 'required'],
['email', 'email'],
['state', 'required',
'when' => function($model) { //when-当满足条件才会去验证
return $model->country == 'USA';
}
'on' => [self::MY_SCENARIO] //on-自定义的当前model的专属场景
],
];
}
}
如下是我自己例子,可直接忽略。背景是当字段os_platform和os_partition满足一定条件时,os_remain必须有。
//验证必须前提是os_remain存在
$request['os_remain'] = isset($request['os_remain'])?$request['os_remain']:'';
$validatorSystemReload = \yii\base\DynamicModel::validateData($request, [
[['os_remain'], 'required', 'default', 'value' => '',
'when' => function () use ($request) {
return (
(
in_array($request['os_platform'],[
'1','2','3'
])
&&
$request['os_partition'] == '3'
)
||
(
in_array($request['os_platform'], [
'4','5'
])
&&
$request['os_partition'] == '1'
)
);
}],
]);
if ($validatorSystemReload->hasErrors()) {
return $this->response(ResCode::CODE_FAILED, 'os_remain不能为空');
}