当前位置:K88软件开发文章中心网站服务器框架Yii 2.0 → 文章内容

输入验证(Validating Input)

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-26 15:29:08

由  创建, 最后一次修改 2016-02-24 输入验证一般说来,程序猿永远不应该信任从最终用户直接接收到的数据,并且使用它们之前应始终先验证其可靠性。要给?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;}validate()?方法,在幕后为执行验证操作,进行了以下步骤:通过从 yii\base\Model::scenarios() 方法返回基于当前 yii\base\Model::scenario 的特性属性列表,算出哪些特性应该进行有效性验证。这些属性被称作?active attributes(激活特性)。通过从 yii\base\Model::rules() 方法返回基于当前 yii\base\Model::scenario 的验证规则列表,这些规则被称作?active rules(激活规则)。用每个激活规则去验证每个与之关联的激活特性。若失败,则记录下对应模型特性的错误信息。声明规则(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()?里的激活规则相关联才会被验证。自定义错误信息大多数的验证器都有默认的错误信息,当模型的某个特性验证失败的时候,该错误信息会被返回给模型。比如,用 yii\validators\RequiredValidator 验证器的规则检验?username?特性失败的话,会返还给模型 "Username cannot be blank." 信息。你可以通过在声明规则的时候同时指定?message?属性,来定制某个规则的错误信息,比如这样:public function rules(){ return [ ['username', 'required', 'message' => 'Please choose a username.'], ];}一些验证器还支持用于针对不同原因的验证失败返回更加准确的额外错误信息。比如,yii\validators\NumberValidator 验证器就支持 yii\validators\NumberValidator::tooBig 和 yii\validators\NumberValidator::tooSmall 两种错误消息用于分别返回输入值是太大还是太小。 你也可以像配置验证器的其他属性一样配置它们俩各自的错误信息。验证事件当调用 yii\base\Model::validate() 方法的过程里,它同时会调用两个特殊的方法,把它们重写掉可以实现自定义验证过程的目的:yii\base\Model::beforeValidate():在默认的实现中会触发 yii\base\Model::EVENT_BEFORE_VALIDATE 事件。你可以重写该方法或者响应此事件,来在验证开始之前,先进行一些预处理的工作。(比如,标准化数据输入)该方法应该返回一个布尔值,用于标明验证是否通过。yii\base\Model::afterValidate():在默认的实现中会触发 yii\base\Model::EVENT_AFTER_VALIDATE 事件。你可以重写该方法或者响应此事件,来在验证结束之后,再进行一些收尾的工作。条件式验证若要只在某些条件满足时,才验证相关特性,比如:是否验证某特性取决于另一特性的值,你可以通过 yii\validators\Validator::when 属性来定义相关条件。举例而言,[ ['state', 'required', 'when' => function($model) { return $model->country == 'USA'; }],]yii\validators\Validator::when 属性会读入一个如下所示结构的 PHP callable 函数对象:/** * @param Model $model 要验证的模型对象 * @param string $attribute 待测特性

[1] [2] [3]  下一页


输入验证(Validating Input)