验证代码,这块代码就是model里面最最常见的代码块了。另外在基本的save、update这些方法的调用里面也会做校验,所以不需要额外手工再调一次这么麻烦。
// 用用户输入来填充模型的特性
$model->attributes = \Yii::$app->request->post('ContactForm');
if ($model->validate()) {
// 若所有输入都是有效的
} else {
// 有效性验证失败:$errors 属性就是存储错误信息的数组
$errors = $model->errors;
}
yii\base\Model::rules()函数的规则格式:
[
// 必须项,用于指定那些模型特性需要通过此规则的验证。
// 对于只有一个特性的情况,可以直接写特性名,而不必用数组包裹。
['attribute1', 'attribute2', ...],
// 必填项,用于指定规则的类型。
// 它可以是类名,验证器昵称,或者是验证方法的名称。
'validator',
// 可选项,用于指定在场景(scenario)中,需要启用该规则
// 若不提供,则代表该规则适用于所有场景
// 若你需要提供除了某些特定场景以外的所有其他场景,你也可以配置 "except" 选项
'on' => ['scenario1', 'scenario2', ...],
// 可选项,用于指定对该验证器对象的其他配置选项
'property1' => 'value1', 'property2' => 'value2', ...
]
自定义错误信息
大多数的验证器都有默认的错误信息,当模型的某个特性验证失败的时候,该错误信息会被返回给模型。
可以通过在声明规则的时候同时指定 message 属性,来定制某个规则的错误信息。
public function rules()
{
return [
['username', 'required', 'message' => 'Please choose a username.'],
];
}
一些验证器还支持用于针对不同原因的验证失败返回更加准确的额外错误信息。比如,yii\validators\NumberValidator 验证器就支持 yii\validators\NumberValidator::tooBig 和 yii\validators\NumberValidator::tooSmall 两种错误消息用于分别返回输入值是太大还是太小。
条件式验证
若要只在某些条件满足时,才验证相关特性,比如:是否验证某特性取决于另一特性的值,你可以通过 yii\validators\Validator::when 属性来定义相关条件。这个功能可以用于判断一些关联字段的必填非必填关系。
eg
[
['state', 'required', 'when' => function($model,$attribute) {
return $model->country == 'USA';
}],
]
若你需要支持客户端的条件验证,你应该配置 yii\validators\Validator::whenClient 属性,它会读入一条包含有 JavaScript 函数的字符串。这个函数将被用于确定该客户端验证规则是否被启用。
[
['state', 'required', 'when' => function ($model) {
return $model->country == 'USA';
}, 'whenClient' => "function (attribute, value) {
return $('#country').value == 'USA';
}"],
]
数据预处理
trim、default、filter 这些过滤器都可以对数据进行预处理。
处理空输入
当输入数据是通过 HTML 表单,你经常会需要给空的输入项赋默认值。你可以通过调整 default 验证器来实现这一点。
默认情况下,当输入项为空字符串,空数组,或 null 时,会被视为“空值”。你也可以通过配置 yii\validators\Validator::isEmpty 属性来自定义空值的判定规则。
对于绝大多数验证器而言,若其 yii\base\Validator::skipOnEmpty 属性为默认值 true,则它们不会对空值进行任何处理。
临时验证
有时,你需要对某些没有绑定任何模型类的值进行 临时验证。
- 可以调用所需验证器的 yii\validators\Validator::validate() 方法。
- 若你需要针对一系列值执行多项验证,你可以使用 yii\base\DynamicModel 。
创建验证器(Validators)
自定义的验证器可以是行内验证器,也可以是独立验证器。
- 行内验证器(Inline Validators)
行内验证器是一种以模型方法或匿名函数的形式定义的验证器。
- 独立验证器(Standalone Validators)
独立验证器是继承自 yii\validators\Validator 或其子类的类。