Yii2.0模型层数据验证
一般说来,程序猿永远不应该信任从最终用户直接接收到的数据,并且使用它们之前应始终先验证其可靠性。要给model填充其所需的用户输入数据,你可以调用 yii\base\Model::validate() 方法验证它们。该方法会返回一个布尔值,指明是否通过验证。若没有通过,你能通过 yii\base\Model::errors 属性获取相应的报错信息。比如
$model = new \app\models\ContactForm;
// 用用户输入来填充模型的特性
$model->attributes = \Yii::$app->request->post('ContactForm');
if ($model->validate()) {
// 若所有输入都是有效的
} else {
// 有效性验证失败:$errors 属性就是存储错误信息的数组
$errors = $model->errors;
}
声明规则(Rules)
要让 validate()
方法起作用,你需要声明与需验证模型特性相关的验证规则。为此,需要重写 yii\base\Model::rules() 方法。下面的例子展示了如何声明 用于验证 ContactForm
模型的相关验证规则:
public function rules()
{
return [
// name,email,subject 和 body 特性是 `require`(必填)的
[['name', 'email', 'subject', 'body'], 'required'],
// email 特性必须是一个有效的 email 地址
['email', 'email'],
];
}
yii\base\Model::rules() 方法应返回一个由规则所组成的数组,每一个规则都呈现为以下这类格式的小数组:
[
// 必须项,用于指定那些模型特性需要通过此规则的验证。
// 对于只有一个特性的情况,可以直接写特性名,而不必用数组包裹。
['attribute1', 'attribute2', ...],
// 必填项,用于指定规则的类型。
// 它可以是类名,验证器昵称,或者是验证方法的名称。
'validator',
// 可选项,用于指定在场景(scenario)中,需要启用该规则
// 若不提供,则代表该规则适用于所有场景
// 若你需要提供除了某些特定场景以外的所有其他场景,你也可以配置 "except" 选项
'on' => ['scenario1', 'scenario2', ...],
// 可选项,用于指定对该验证器对象的其他配置选项
'property1' => 'value1', 'property2' => 'value2', ...
]
对于每个规则,你至少需要指定该规则适用于哪些特性,以及本规则的类型是什么。你可以指定以下的规则类型之一:
- 核心验证器的昵称,比如
required
、in
、date
,等等。请参考点击打开链接。 - 模型类中的某个验证方法的名称,或者一个匿名方法。请参考行内验证器小节了解更多。
- 验证器类的名称。请参考独立验证器小节了解更多。
一个规则可用于验证一个或多个模型特性,且一个特性可以被一个或多个规则所验证。一个规则可以施用于特定场景(scenario),只要指定 on
选项。如果你不指定 on
选项,那么该规则会适配于所有场景。
当调用 validate()
方法时,它将运行以下几个具体的验证步骤:
- 检查从声明自 yii\base\Model::scenarios() 方法的场景中所挑选出的当前yii\base\Model::scenario的信息,从而确定出那些特性需要被验证。这些特性被称为激活特性。
- 检查从声明自 yii\base\Model::rules() 方法的众多规则中所挑选出的适用于当前yii\base\Model::scenario的规则,从而确定出需要验证哪些规则。这些规则被称为激活规则。
- 用每个激活规则去验证每个与之关联的激活特性。
基于以上验证步骤,有且仅有声明在 scenarios()
方法里的激活特性,且它还必须与一或多个声明自 rules()
里的激活规则相关联才会被验证。
自定义错误信息
大多数的验证器都有默认的错误信息,当模型的某个特性