灵活运用 - 自定义验证类

  • 作者:KK

  • 发表日期:2016.10.25


以创建一个中国的手机号码验证器为例子

第一步:创建验证器类

在你规划好的命名空间目录下创建一个类

我们起名为MobileValidator吧,放在@app这个别名目录下

继承yii\validators\Validator


第二步:实现验证方法

添加validateValue这个方法:

protected function validateValue($value){
	if(preg_match('/^1[0-9]{10}$/', $value)){
	   return null;
	}else{
		return ['手机号验证器提示您,' . $value . ' 不是手机号', []];
	}
}

其中$value就是要被验证是否为手机号的值


第三步:在模型里配置

在模型里声明rules和一个装载手机号的属性如下:

namespace app;

class TestForm extends \yii\base\Model{
	public $phone = '';

	public function rules(){
		return [
			['phone', 'app\MobileValidator'],
		];
	}
}

第四步:直接在控制器测试

$form = new \app\TestForm();
$form->phone = '1234567890';
$form->validate();
print_r($form->errors); //有手机号的报错

$form->phone = '13800138000';
$form->validate();
print_r($form->errors); //没有任何报错

第五步:自定义报错消息

yii\validators\Validator本身已经有了一个叫$message的属性,所以可以通过rules给验证器配置message:

public function rules(){
	return [
		['phone', 'yii\validators\MobileValidator', 'message' => '手机号格式不正确'],
	];
}

可是这时候还不会生效,因为要在验证失败时返回这个消息才可以:

protected function validateValue($value){
	if(preg_match('/^1[0-9]{10}$/', $value)){
	   return null;
	}else{
		$message = $this->message ? $this->message : '手机号校验失败';
		return [$message, []];
	}
}