Yii特設動態驗證


有時不需要綁定驗證值到任何模型。您可以使用 yii\base\DynamicModel 類,它支持動態定義attributes 和 rules。
第1步 - 將 actionAdHocValidation 方法添加到 SiteController ,如下所示:
public function actionAdHocValidation() {
   $model = DynamicModel::validateData([
      'username' => 'hippo',
      'email' => '[email protected]'
   ], [
      [['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特設動態驗證

自定義驗證器

有兩種類型的自定義驗證器 -
  • 內聯驗證器
  • 獨立驗證器

內聯驗證器通過模型法或匿名函數定義。如果屬性無法驗證,應該調用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()]
         ];
      }
   }
?>