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