假设我有一个模型项目,owner_id代表项目的所有者。在创建新项目时,用户需要键入所有者的名称而不是id。我编写了一个方法来验证,以确保用户确实存在于系统中,然后我可以获得用户的id。规则是:
array('owner_name', 'userValidation')
但是我发现只有当下面的语句执行
时才会调用验证。 $model->save()
这意味着如果我试图在保存之前使用语句
获取不在系统中的用户的id $model->validate();
$user=User::model()->findByAttributes(array('username'=>$model->owner_name));
$model->owner_id=$user->id;
将会有一个异常。所以我的问题是,当我调用validate()方法时,为什么验证不像预期的那样工作?我检查了方法保存在Yii
的源代码 public function save($runValidation=true,$attributes=null)
{
if(!$runValidation || $this->validate($attributes))
return $this->getIsNewRecord() ? $this->insert($attributes) : $this->update($attributes);
else
return false;
}
我认为它也尝试通过调用validate()来验证
您没有检查validate()的返回值。试试这样做:
if ($model->validate()) {
$user=User::model()->findByAttributes(array('username'=>$model->owner_name));
$model->owner_id=$user->id;
/// ...
} else {
// handle the case that userValidation failed
}