Yii - Ad-hoc-Validierung

Manchmal müssen Sie Werte validieren, die an kein Modell gebunden sind. Du kannst den ... benutzenyii\base\DynamicModel Klasse, die das spontane Definieren von Attributen und Regeln unterstützt.

Step 1 - Fügen Sie die actionAdHocValidation Methode zum SiteController.

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

Im obigen Code definieren wir a “dynamic” Modell mit Benutzernamen und E-Mail-Attributen und validieren Sie diese.

Step 2 - Typ http://localhost:8080/index.php?r=site/ad-hoc-validation In der Adressleiste des Webbrowsers wird eine Fehlermeldung angezeigt, da unsere E-Mail 14 Zeichen lang ist.

Benutzerdefinierte Validatoren

Es gibt zwei Arten von benutzerdefinierten Validatoren:

  • Inline-Validatoren
  • Standalone-Validatoren

Ein Inline-Validator wird durch eine Modellmethode oder eine anonyme Funktion definiert. Wenn ein Attribut die Validierung nicht besteht, sollten Sie das aufrufenyii\base\Model::addError() Methode zum Speichern der Fehlermeldung.

Das folgende Beispiel für die RegistrationForm validiert das Stadteigentum, sodass nur zwei Werte akzeptiert werden können - London und 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".');
         }
      }
   }
?>

Ein eigenständiger Validator erweitert die yii\validators\ValidatorKlasse. Um die Validierungslogik zu implementieren, sollten Sie die überschreibenyii\validators\Validator::validateAttribute() Methode.

Step 1 - Um das vorherige Beispiel mit dem Standalone-Validator zu implementieren, fügen Sie a hinzu CityValidator.php Datei an die components Mappe.

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

Step 2 - Ändern Sie dann die RegistrationForm Modellieren Sie auf diese Weise.

<?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()]
         ];
      }
   }
?>