Yii - Validação Ad Hoc

Às vezes, você precisa validar valores que não estão vinculados a nenhum modelo. Você pode usar oyii\base\DynamicModel classe, que oferece suporte à definição de atributos e regras em tempo real.

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

No código acima, definimos um “dynamic” modelar com nome de usuário e atributos de email e validá-los.

Step 2 - Tipo http://localhost:8080/index.php?r=site/ad-hoc-validation na barra de endereço do navegador da web, você verá uma mensagem de erro porque nosso e-mail tem 14 caracteres.

Validadores personalizados

Existem dois tipos de validadores personalizados -

  • Validadores inline
  • Validadores autônomos

Um validador embutido é definido por um método de modelo ou uma função anônima. Se um atributo falhar na validação, você deve chamar oyii\base\Model::addError() método para salvar a mensagem de erro.

O exemplo a seguir do RegistrationForm valida a propriedade da cidade, portanto, pode aceitar apenas dois valores - Londres e 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".');
         }
      }
   }
?>

Um validador autônomo estende o yii\validators\Validatorclasse. Para implementar a lógica de validação, você deve substituir oyii\validators\Validator::validateAttribute() método.

Step 1 - Para implementar o exemplo anterior usando o validador autônomo, adicione um CityValidator.php arquivo para o components pasta.

<?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 - Então, modifique o RegistrationForm modelar desta forma.

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