Yii 即席验证
有时您需要验证与任何模型无关的值。您可以使用yii\base\DynamicModel类,它支持即席定义属性和规则。
步骤1 - 将actionAdHocValidation方法添加到SiteController中。
public function actionAdHocValidation() {
model = DynamicModel::validateData([
'username' => 'John',
'email' => 'john@gmail.com'
], [
[['username', 'email'], 'string', 'max' => 12],
['email', 'email'],
]);
if (model->hasErrors()) {
var_dump($model->errors);
} else {
echo "success";
}
}
在上面的代码中,我们定义了一个具有用户名和电子邮件属性的“动态”模型,并对其进行验证。
步骤2 - 在Web浏览器的地址栏中输入 http://localhost:8080/index.php?r=site/ad-hoc-validation ,您将看到一个错误消息,因为我们的电子邮件长度为14个字符。
自定义验证器
有两种类型的自定义验证器−
- 内联验证器
- 独立验证器
内联验证器是由模型方法或匿名函数定义的。如果一个属性未通过验证,你应该调用 yii\base\Model::addError() 方法来保存错误消息。
下面的例子中, RegistrationForm 的验证器验证城市属性,因此它只能接受两个值−伦敦和巴黎。
<?php
namespace app\models;
use Yii;
use yii\base\Model;
class RegistrationForm extends Model {
public username;
publicpassword;
public email;
publiccountry;
public city;
publicphone;
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".');
}
}
}
?>
一个独立的验证器继承自 yii\validators\Validator 类。为了实现验证逻辑,你需要覆盖 yii\validators\Validator::validateAttribute() 方法。
步骤1 - 为了使用独立验证器实现前面的例子,将一个 CityValidator.php 文件添加到 components 文件夹中。
<?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".');
}
}
}
?>
步骤2 − 然后,按以下方式修改 RegistrationForm 模型。
<?php
namespace app\models;
use app\components\CityValidator;
use Yii;
use yii\base\Model;
class RegistrationForm extends Model {
public username;
publicpassword;
public email;
publiccountry;
public city;
publicphone;
public function rules() {
return [
['city', CityValidator::className()]
];
}
}
?>