Yii Framework2.0开发教程(8)输入验证

jerry Yii2 2015年11月23日 收藏

validate() 方法,在幕后为执行验证操作。先看一个简单的例子,例子的代码在《Yii Framework2.0开发教程(2)使用表单Form》。

类ZhyoulunController中函数actionEntry() ,其中有一句$model->validate(),就是来判断输入的名字和电子邮件是否正确。

修改models/EntryForm.php

  1. <?php
  2.  
  3. namespace app\models;
  4.  
  5. use yii\base\Model;
  6.  
  7. class EntryForm extends Model
  8. {
  9.     public $name;
  10.     public $email;
  11.  
  12.     public function rules()
  13.     {
  14.         return [
  15.             ['name', 'required','message'=>'名称不可缺省'],
  16.             ['email', 'required','message'=>'邮件不能缺省'],
  17. ['email', 'email','message'=>'电子邮件格式不正确'],
  18.         ];
  19.     }
  20. }

可以看到如下表现

都不输入


邮件格式错误


输入都正确


很容易和我们修改后的代码对应。


validate() 方法,在幕后为执行验证操作,进行了以下步骤:

1、通过从 [[yii\base\Model::scenarios()]] 方法返回基于当前 [[yii\base\Model::scenario|场景(scenario)]] 的特性属性列表算出哪些特性应该进行有效性验证。这些属性被称作active attributes(激活特性)

2、通过从 [[yii\base\Model::rules()]] 方法返回基于当前 [[yii\base\Model::scenario|场景(scenario)]] 的验证规则列表,这些规则被称作active rules(激活规则)

3、用每个激活规则去验证每个与之关联的激活特性。若失败,则记录下对应模型特性的错误信息。

rules()函数的语法

  1. [
  2.     // 必须项,用于指定那些模型特性需要通过此规则的验证。
  3.     // 对于只有一个特性的情况,可以直接写特性名,而不必用数组包裹。
  4.     ['attribute1', 'attribute2', ...],
  5.  
  6.     // 必填项,用于指定【规则的类型】。
  7.     // 它可以是类名,验证器昵称,或者是验证方法的名称。
  8.     'validator',
  9.  
  10.     // 可选项,用于指定在场景(scenario)中,需要启用该规则
  11.     // 若不提供,则代表该规则适用于所有场景
  12.     // 若你需要提供除了某些特定场景以外的所有其他场景,你也可以配置 "except" 选项
  13.     'on' => ['scenario1', 'scenario2', ...],
  14.  
  15.     // 可选项,用于指定对该验证器对象的其他配置选项
  16.     'property1' => 'value1', 'property2' => 'value2', ...
  17. ]

你可以指定以下的规则类型之一:

核心验证器的昵称,比如 required、in、date,等等。请参考【核心验证器章节】查看完整的核心验证器列表。

模型类中的某个验证方法的名称,或者一个匿名方法。请参考【行内验证器小节】了解更多。

验证器类的名称。请参考【独立验证器小节】了解更多。

一个规则可用于验证一个或多个模型特性,且一个特性可以被一个或多个规则所验证。

核心验证器https://github.com/yiisoft/yii2/blob/master/docs/guide-zh-CN/tutorial-core-validators.md

default

  1. ['age', 'default', 'value' => null],// 若 "age" 为空,则将其设为 null
  2. ['country', 'default', 'value' => 'USA'],// 若 "country" 为空,则将其设为 "USA"
  3. // 若 "from" 和 "to" 为空,则分别给他们分配自今天起,3 天后和 6 天后的日期。
  4. [['from', 'to'], 'default', 'value' => function ($model, $attribute) {
  5. return date('Y-m-d', strtotime($attribute === 'to' ? '+3 days' '+6 days'));
  6. }],

trim

  1. ['name','trim'],//去掉输入信息的首尾空格

行内验证器

1、以匿名函数形式定义的行内验证器

  1. ['name', 
  2. function($attribute, $params) 
  3. {
  4.                 if (!ctype_alnum($this->$attribute)) 
  5. {
  6.                     $this->addError($attribute, '令牌本身必须包含字母或数字。');
  7.                 }
  8. }
  9. ],



2、以模型方法 validateCountry() 形式定义的行内验证器

  1. <?php
  2.  
  3. namespace app\models;
  4.  
  5. use yii\base\Model;
  6.  
  7. class EntryForm extends Model
  8. {
  9.     public $name;
  10.     public $email;
  11.  
  12.     public function rules()
  13.     {
  14.         return [
  15.             ['name', 'required','message'=>'名称不可缺省'],
  16.             ['email', 'required','message'=>'邮件不能缺省'],
  17. ['email', 'email','message'=>'电子邮件格式不正确'],
  18. // ['name', 
  19. // function($attribute, $params) 
  20. // {
  21. //                if (!ctype_alnum($this->$attribute)) 
  22. // {
  23. //                    $this->addError($attribute, '令牌本身必须包含字母或数字。');
  24. //                }
  25. // }
  26. // ],
  27. ['name', 'validateCountry'],
  28.         ];
  29.     }
  30. public function validateCountry($attribute, $params)
  31.     {
  32.         if (!in_array($this->$attribute, ['呵呵', '嘿嘿'])) {
  33.             $this->addError($attribute, '必须为 "呵呵" 或 "嘿嘿" 中的一个。');
  34.         }
  35.     }
  36. }