有时不需要绑定验证值到任何模型。您可以使用 yii\base\DynamicModel 类,它支持动态定义attributes 和 rules。
	
		第1步 - 将 actionAdHocValidation 方法添加到 SiteController ,如下所示:
	
public function actionAdHocValidation() {
   $model = DynamicModel::validateData([
      'username' => 'hippo',
      'email' => 'xuhuhu.com@gmail.com'
   ], [
      [['username', 'email'], 'string', 'max' => 12],
      ['email', 'email'],
   ]);
	
   if ($model->hasErrors()) {
      var_dump($model->errors);
   } else {
      echo "success";
   }
}
	
		在上面的代码中,我们定义一个 username 和 email 属性的“动态”模式并对其进行验证。
	
	
		上面的代码还需要在开始位置加入一行:use yii\base\DynamicModel ;
	
	
		第2步 -在Web浏览器的地址栏中输入URL:http://localhost:8080/index.php?r=site/ad-hoc-validation ,这时会看到一个错误信息,因为电子邮件(email)有超过 12 个字符。
 
	
		
			自定义验证器
		
	
	
		有两种类型的自定义验证器 -
	
	- 
			内联验证器
- 
			独立验证器
内联验证器通过模型法或匿名函数定义。如果属性无法验证,应该调用yii\base\Model::addError() 方法来保存错误消息。
		下面的例子 RegistrationForm 验证了 city 属性,所以它只能接受两个值 - Haikou 和 Guangzhou。
	
<?php
   namespace app\models;
   use Yii;
   use yii\base\Model;
   class RegistrationForm extends Model {
      public $username;
      public $password;
      public $email;
      public $country;
      public $city;
      public $phone;
      public function rules() {
         return [
            ['city', 'validateCity']
         ];
      }
      public function validateCity($attribute, $params) {
         if (!in_array($this->$attribute, ['Haikou', 'Guangzhou'])) {
            $this->addError($attribute, 'The city must be either "London" or "Paris".');
         }
      }
   }
?> 
	一个独立的验证器一般是扩展 yii\validators\Validator 类。要实现验证逻辑,应该重写 yii\validators\Validator::validateAttribute() 方法。
		为了实现验证逻辑,就应该重写yii\validators\Validator::validateAttribute() 方法。
	
<?php
   namespace app\components;
   use yii\validators\Validator;
   class CityValidator extends Validator {
      public function validateAttribute($model, $attribute) {
         if (!in_array($model->$attribute, ['Paris', 'London'])) {
            $this->addError($model, $attribute, 'The city must be either "Haikou"
               or "Guangzhou".');
         }
      }
   }
?>
	
		第2步 - 然后,修改 RegistrationForm 以如下这种方式。
	
<?php
   namespace app\models;
   use app\components\CityValidator;
   use Yii;
   use yii\base\Model;
   class RegistrationForm extends Model {
      public $username;
      public $password;
      public $email;
      public $country;
      public $city;
      public $phone;
      public function rules() {
         return [
            ['city', CityValidator::className()]
         ];
      }
   }
?>
						上一篇:
								Yii验证
												下一篇:
								Yii AJAX验证
												
						
						
					
					
					