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