yii2独立验证器适用于复用性强、逻辑复杂或需灵活配置的校验场景,如手机号、身份证号、区域限制邮箱等;它以独立类形式存在,继承validator,重写validateattribute(),通过public属性接收配置,用adderror()抛错,支持占位符提示和客户端js验证。

Yii2 独立验证器适合复用性强、逻辑复杂或需灵活配置的校验场景,比如手机号格式、身份证号、带区域限制的邮箱等。它不依赖模型方法,而是以独立类形式存在,结构清晰、可测试、易维护。
创建验证器类的基本结构
新建一个 PHP 类,例如 PhoneValidator.php,放在 components/validators/ 或你约定的命名空间下:
- 必须继承
yii\validators\Validator - 类名必须以 Validator 结尾(如
PhoneValidator),否则 Yii 自动加载会失败 - 重写
validateAttribute()方法,核心校验逻辑写在这里 - 在
init()中调用parent::init(),否则$this->message、$this->on等基础属性未初始化
支持配置参数的写法
把需要外部传入的配置项声明为 public 属性,例如要求严格校验中国手机号:
public $country = 'CN'; public $strict = true;
然后在模型的 rules() 中传参:
['mobile', 'PhoneValidator', 'country' => 'CN', 'strict' => true]
验证器内部即可直接使用 $this->country 和 $this->strict 进行判断。
正确抛出错误与设置提示信息
验证失败时,不要 return false 或 throw 异常,而是调用:
$this->addError($model, $attribute, $this->message ?: '手机号格式不正确');
注意:addError() 第一个参数是模型实例,不是字符串;若未设置 $this->message,建议提供默认提示,避免空错误。
如果想让提示中包含动态内容(如当前国家),可用占位符:
public $message = '{attribute} 不是有效的 {country} 手机号';
框架会自动替换 {attribute} 和 {country}。
可选:添加客户端验证支持
若希望表单失去焦点时也触发 JS 校验,需实现 clientValidateAttribute() 方法,返回合法 JS 字符串:
public function clientValidateAttribute($model, $attribute, $view)
{
$message = addslashes($this->message ?: '手机号格式不正确');
return
<p>注意引号转义和正则兼容性,服务端仍需做最终校验,JS 仅作体验优化。</p>











