Yii2中实现字段唯一性验证需同步配置模型规则、视图Ajax启用和控制器响应三处:Model中用unique规则并正确设置targetClass与targetAttribute;View中ActiveForm开启enableAjaxValidation;Controller中在load后判断isAjax并返回ActiveForm::validate结果。

在Yii2中实现用户名、邮箱或手机号等字段的唯一性验证,必须同时配置模型规则、视图表单和控制器响应三处,缺一不可,否则Ajax实时验证会静默失败或始终报错。
在Model中定义unique规则
打开对应模型文件(如User.php),在rules()方法中添加unique验证器。
【注意】targetClass必须指向实际存储该字段的数据表对应AR模型类,不能照抄示例路径;若字段名与数据库列名不一致,还需显式指定targetAttribute。
['email', 'unique', 'targetClass' => '\common\models\User', 'message' => '该邮箱已被注册!']
若需联合唯一(如app_id + group_id组合不可重复),写法为:[['app_id', 'group_id'], 'unique', 'targetAttribute' => ['app_id', 'group_id']]。
在View中启用Ajax验证
使用ActiveForm::begin()时,必须设置'enableAjaxValidation' => true,否则前端不会发起异步校验请求。
<?php $form = ActiveForm::begin(['enableAjaxValidation' => true]); ?>
这一步漏掉,输入框失去失焦即时反馈能力,用户只能等到提交时才看到错误提示。
在Controller中处理Ajax验证请求
第一步:确认当前Action能接收并识别Ajax请求。
第二步:在$model->load()成功后,判断是否为Ajax提交——Yii::$app->request->isAjax为真时,立即返回JSON格式的验证结果。
第三步:强制设置响应格式为JSON,并调用ActiveForm::validate($model)生成错误数组。
if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {<br> Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;<br> return \yii\widgets\ActiveForm::validate($model);<br>}
【关键】必须在if ($model->load(...))块内执行,且不能放在save()之后——否则验证逻辑被跳过。


















