yii2.0.55表单验证需在模型层定义rules()、控制器中调用load()和validate()、视图中用activeform渲染;内置验证支持链式配置,自定义验证需声明并实现方法;客户端校验可启用html5或ajax,但服务端validate()调用不可或缺。

确保用户提交的数据符合业务规则、不入库脏数据、防止绕过前端校验的恶意请求,是Yii2.0.55表单验证配置的核心目标。你不能只靠JavaScript拦截,也不能把验证逻辑全扔进控制器——必须在模型层定义规则、在控制器中触发校验、在视图里正确渲染错误提示,三者缺一不可。
在Model中声明验证规则
打开你的模型类(如LoginForm.php),找到rules()方法,返回一个二维数组,每项代表一条验证规则。
第一项必须是字段名与验证器的组合:例如[['username', 'email'], 'required']表示这两个字段都不能为空;['email', 'email']表示单独校验邮箱格式。
内置验证器支持链式写法,比如['password', 'string', 'min' => 8, 'max' => 32],但注意:若字段值为"0"或false,默认会被required判为空——【需显式添加'skipOnEmpty' => false才能强制非空校验】。
自定义验证方法必须先声明再实现:在rules()中加入['password', 'validatePasswordStrength'],然后在模型内定义public function validatePasswordStrength($attribute, $params),并在内部调用$this->addError($attribute, '提示语')。
在Controller中触发验证流程
控制器接收POST数据后,先执行$model->load(Yii::$app->request->post())完成属性批量赋值,这一步失败会导致后续validate()无数据可校验。
紧接着必须调用$model->validate()——【不调用此方法,rules()定义的任何规则都不会生效】。
验证通过后才执行业务逻辑,例如$model->login();失败则直接return $this->render('login', ['model' => $model]),让视图重新显示带错误信息的表单。
若走AJAX提交,需额外设置响应格式:Yii::$app->response->format = \yii\web\Response::FORMAT_JSON,再返回\yii\bootstrap\ActiveForm::validate($model, ['username', 'email']),注意第二个参数限定字段,避免验证码等一次性字段被重复验证。
在View中渲染带校验反馈的表单
使用ActiveForm::begin()创建表单容器,它会自动注入CSRF token并绑定模型。
每个字段用$form->field($model, 'username')->textInput()生成,错误信息会自动追加到对应字段下方,无需手动写echo $model->getFirstError('username')。
方法一:启用客户端JS校验,在ActiveForm::begin()中传入'enableClientValidation' => true,框架会自动生成HTML5 required 和 type="email" 属性,并挂载jQuery validation插件逻辑。
方法二:启用AJAX实时校验,仅对特定字段开启:= $form->field($model, 'username', ['enableAjaxValidation' => true])->textInput() ?>,后台需配合前述AJAX验证接口。
方法三:禁用所有前端校验,纯服务端兜底——把'enableClientValidation'和'enableAjaxValidation'全设为false,适合内部系统或调试阶段快速验证规则逻辑是否正确。











