Yii2表单验证核心是重写rules()返回规则数组并调用validate()触发自动校验:1. rules()定义必填、邮箱、长度等内置规则及自定义方法;2. load后validate()执行并用errors或firstErrors获取结果;3. 内联验证通过public方法实现;4. 客户端/AJAX验证仅作体验优化,服务端校验不可省略。

Yii2.0 表单验证的核心写法很明确:在模型类中重写 rules() 方法,返回规则数组,再调用 $model->validate() 触发校验。它不是靠手动逐个判断字段,而是由框架自动按规则执行、收集错误。
Yii2.0 表单验证怎么写
1. 定义验证规则(rules() 方法)
每个规则是一个数组,格式为:
[ ['属性名1', '属性名2'], '验证器类型', '选项键' => '选项值' ]
常见写法示例:
public function rules()
{
return [
// 必填项
[['username', 'email'], 'required'],
// 邮箱格式
['email', 'email'],
// 用户名长度限制
['username', 'string', 'min' => 2, 'max' => 16],
// 密码需自定义逻辑
['password', 'validatePasswordStrength'],
// 确认密码一致
['password_repeat', 'compare', 'compareAttribute' => 'password'],
// ID 必须存在于 user 表中
['user_id', 'exist', 'targetClass' => User::class, 'targetAttribute' => 'id'],
// 数组元素全为整数(如 deleteIds 是数组)
[['deleteIds'], 'each', 'rule' => ['integer']],
];
}2. 执行验证并获取结果
$model = new MyForm();
$model->load(\Yii::$app->request->post()); // 自动赋值
if ($model->validate()) {
// 验证通过,可继续保存或处理
} else {
// 获取全部错误:$model->errors → ['username' => ['用户名不能为空']]
// 或单个字段首个错误:$model->firstErrors['username']
}3. 自定义验证方法(内联验证)
在模型中写一个 public 方法,规则里直接引用方法名:
['username', 'validateUsername']
public function validateUsername($attribute, $params)
{
if (stripos($this->$attribute, 'admin') !== false) {
$this->addError($attribute, '用户名不能包含 admin');
}
}4. 客户端与 AJAX 验证(可选增强)
- 视图中启用:
$form->field($model, 'email')->textInput(['data-enable-ajax' => true]) - 控制器需配置
enableAjaxValidation => true并响应 JSON 错误 - 注意:服务端验证不可省略,客户端仅作体验优化
Yii3 变化大吗
Yii3 是一次彻底重构,但表单验证逻辑本身变化不大,只是写法更现代、更松耦合:
- ✅
rules()结构基本保留,语义没变 - ✅
validate()仍为入口,$errors仍是错误容器 - ✅ 内置验证器(
required、email、exist等)功能一致 - ❌ 移除了
CActiveForm等旧组件,改用更轻量的Html::input()+ 手动绑定 - ❌ 验证器类从
yii\validators\XxxValidator改为基于 PSR-14 的事件驱动设计,但开发者通常不直接操作 - ❌ 模型不再强制继承
Model,可使用纯 PHP 对象 +ValidationInterface实现验证(灵活性提升,但非必须)
简单说:
如果你熟悉 Yii2 的
rules()和validate(),迁移到 Yii3 不需要重学验证逻辑;
但项目升级时需适配新命名空间、依赖注入方式和表单渲染习惯,验证部分反而属于“平滑过渡区”。
不复杂但容易忽略:无论 Yii2 还是 Yii3,所有关键验证都必须在服务端执行——前端校验只是锦上添花,绝不能替代。


















