自定义验证器
有两种类型的自定义验证器 -
内联验证器由模型方法或匿名函数定义。如果一个属性验证失败,你应该调用yii\base\Model::addError()方法来保存错误信息。
下面的RegistrationForm示例验证了 city 属性,因此它只能接受两个值——London 和 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".');
}
}
}
?>
一个独立的验证器扩展了yii\validators\Validator类。要实现验证逻辑,你应该重写yii\validators\Validator::validateAttribute()方法。
第 1 步- 要使用独立验证器实现前面的示例,请将CityValidator.php文件添加到组件文件夹。
<?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;
public $password;
public $email;
public $country;
public $city;
public $phone;
public function rules() {
return [
['city', CityValidator::className()]
];
}
}
?>