Yii - Ad-hoc-Validierung
Manchmal müssen Sie Werte validieren, die an kein Modell gebunden sind. Du kannst den ... benutzenyii\base\DynamicModel Klasse, die das spontane Definieren von Attributen und Regeln unterstützt.
Step 1 - Fügen Sie die actionAdHocValidation Methode zum 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";
}
}
Im obigen Code definieren wir a “dynamic” Modell mit Benutzernamen und E-Mail-Attributen und validieren Sie diese.
Step 2 - Typ http://localhost:8080/index.php?r=site/ad-hoc-validation In der Adressleiste des Webbrowsers wird eine Fehlermeldung angezeigt, da unsere E-Mail 14 Zeichen lang ist.
Benutzerdefinierte Validatoren
Es gibt zwei Arten von benutzerdefinierten Validatoren:
- Inline-Validatoren
- Standalone-Validatoren
Ein Inline-Validator wird durch eine Modellmethode oder eine anonyme Funktion definiert. Wenn ein Attribut die Validierung nicht besteht, sollten Sie das aufrufenyii\base\Model::addError() Methode zum Speichern der Fehlermeldung.
Das folgende Beispiel für die RegistrationForm validiert das Stadteigentum, sodass nur zwei Werte akzeptiert werden können - London und 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".');
}
}
}
?>
Ein eigenständiger Validator erweitert die yii\validators\ValidatorKlasse. Um die Validierungslogik zu implementieren, sollten Sie die überschreibenyii\validators\Validator::validateAttribute() Methode.
Step 1 - Um das vorherige Beispiel mit dem Standalone-Validator zu implementieren, fügen Sie a hinzu CityValidator.php Datei an die components Mappe.
<?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 - Ändern Sie dann die RegistrationForm Modellieren Sie auf diese Weise.
<?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()]
];
}
}
?>