Yii - 即席驗證



有時您需要驗證未繫結到任何模型的值。您可以使用yii\base\DynamicModel類,它支援動態定義屬性和規則。

步驟 1 - 將actionAdHocValidation方法新增到SiteController

public function actionAdHocValidation() {
   $model = DynamicModel::validateData([
      'username' => 'John',
      'email' => 'john@gmail.com'
   ], [
      [['username', 'email'], 'string', 'max' => 12],
      ['email', 'email'],
   ]);
	
   if ($model->hasErrors()) {
      var_dump($model->errors);
   } else {
      echo "success";
   }
}

在上面的程式碼中,我們定義了一個具有使用者名稱和電子郵件屬性的“動態”模型並對其進行驗證。

步驟 2 - 在 Web 瀏覽器的位址列中鍵入https://:8080/index.php?r=site/ad-hoc-validation,您將看到錯誤訊息,因為我們的電子郵件長度為 14 個字元。

Fourteen Character Long

自定義驗證器

有兩種型別的自定義驗證器:

  • 內聯驗證器
  • 獨立驗證器

內聯驗證器由模型方法或匿名函式定義。如果屬性驗證失敗,則應呼叫yii\base\Model::addError()方法來儲存錯誤訊息。

以下RegistrationForm的示例驗證city屬性,因此它只能接受兩個值 – London 和 Paris。

<?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, ['Paris', 'London'])) {
            $this->addError($attribute, 'The city must be either "London" or "Paris".');
         }
      }
   }
?>

獨立驗證器擴充套件了yii\validators\Validator類。要實現驗證邏輯,您應該重寫yii\validators\Validator::validateAttribute()方法。

步驟 1 - 要使用獨立驗證器實現前面的示例,請將CityValidator.php檔案新增到components資料夾。

<?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 "Paris"
               or "London".');
         }
      }
   }
?>

步驟 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()]
         ];
      }
   }
?>
廣告