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