Yii - Validazione ad hoc

A volte è necessario convalidare valori che non sono legati a nessun modello. Puoi usare il fileyii\base\DynamicModel class, che supporta la definizione di attributi e regole al volo.

Step 1 - Aggiungi il file actionAdHocValidation metodo al 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";
   }
}

Nel codice sopra, definiamo un file “dynamic” modello con nome utente e attributi di posta elettronica e convalidarli.

Step 2 - Tipo http://localhost:8080/index.php?r=site/ad-hoc-validation nella barra degli indirizzi del browser web, vedrai un messaggio di errore perché la nostra email è lunga 14 caratteri.

Validatori personalizzati

Esistono due tipi di validatori personalizzati:

  • Validatori in linea
  • Validatori autonomi

Un validatore inline è definito da un metodo modello o da una funzione anonima. Se un attributo non supera la convalida, è necessario chiamare il fileyii\base\Model::addError() metodo per salvare il messaggio di errore.

Il seguente esempio di RegistrationForm convalida la proprietà della città, quindi può accettare solo due valori: Londra e Parigi.

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

Un validatore autonomo estende l'estensione yii\validators\Validatorclasse. Per implementare la logica di convalida, è necessario sostituire il fileyii\validators\Validator::validateAttribute() metodo.

Step 1 - Per implementare l'esempio precedente utilizzando il validatore autonomo, aggiungi un file CityValidator.php file in components cartella.

<?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 - Quindi, modifica il file RegistrationForm modello in questo modo.

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