Yii - Validación ad hoc

A veces es necesario validar valores que no están vinculados a ningún modelo. Puedes usar elyii\base\DynamicModel class, que admite la definición de atributos y reglas sobre la marcha.

Step 1 - Agregue el actionAdHocValidation método para el 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";
   }
}

En el código anterior, definimos un “dynamic” modelo con nombre de usuario y atributos de correo electrónico y validarlos.

Step 2 - Tipo http://localhost:8080/index.php?r=site/ad-hoc-validation en la barra de direcciones del navegador web, verá un mensaje de error porque nuestro correo electrónico tiene 14 caracteres.

Validadores personalizados

Hay dos tipos de validadores personalizados:

  • Validadores en línea
  • Validadores independientes

Un validador en línea se define mediante un método de modelo o una función anónima. Si un atributo falla en la validación, debe llamar alyii\base\Model::addError() método para guardar el mensaje de error.

El siguiente ejemplo de RegistrationForm valida la propiedad de la ciudad, por lo que solo puede aceptar dos valores: Londres y París.

<?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 validador independiente extiende la yii\validators\Validatorclase. Para implementar la lógica de validación, debe anular layii\validators\Validator::validateAttribute() método.

Step 1 - Para implementar el ejemplo anterior usando el validador independiente, agregue un CityValidator.php archivo al components carpeta.

<?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 - Luego, modifique el RegistrationForm modelar de esta manera.

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