验证CakePHP2中的关联模型

时间:2013-07-08 19:59:22

标签: cakephp-2.0 cakephp-appmodel

我是CakePHP的菜鸟,我一直在尝试做一些复杂的验证:

我有以下型号: - 字体(名称,文件); - 设置(value1,value2,value3,type_id,script_id); - 类型(名称)

每当我创建一个Font时,我也会创建一个与之关联的默认设置。此外,此设置具有关联的类型。创建字体后,我可以将更多设置关联到它(字体有多个设置),但我需要确保相同类型的两个设置不会添加到该字体。我不知道如何处理这个案子。任何帮助表示赞赏。感谢。

1 个答案:

答案 0 :(得分:0)

我使用简单的beforeSave验证

//in setting.php model
public function beforeSave($options = array()) {

    if (isset($this->data[$this->alias]['font_id']) && isset($this->data[$this->alias]['type_id']) {
        $otherSettings = $this->find('all', array('conditions'=>
            array('type_id'=>$this->data[$this->alias]['type_id'],
                  'font_id'=>$this->data[$this->alias]['font_id']);

        //check if it's insert or update
        $updated_id = null;
        if ($this->id)
            $updated_id = $this->id;
        if (isset($this->data[$this->alias][$this->primaryKey]))
            $updated_id = $this->data[$this->alias][$this->primaryKey];

        if (count($otherSettings) > 0) {
            if ($updated_id == null)
               return false;  //it's not an update and we found other records, so fail

            foreach ($otherSettings as $similarSetting)
               if ($updated_id != $similarSetting['Setting']['id'])
                  return false;  //found a similar record with other id, fail
        }
    }

    return true; //don't forget this, it won't save otherwise
}

这会阻止将新设置插入相同类型的相同字体。请记住,如果验证不正确,此验证将返回false,但您必须处理警告用户错误的方式。您可以从beforeSave中抛出异常并在控制器中捕获它们以向用户显示闪存消息。或者您可以不保存这些设置并让用户弄清楚(不好的做法)。

您也可以在模型中创建一个类似的函数,如checkPreviousSettings,其逻辑与我上面写的类似,检查要保存的设置是否有效,如果没有向用户显示消息在尝试保存之前。

我更喜欢的选项是异常处理错误,在这种情况下,您必须将return false替换为

throw new Exception('Setting of the same type already associated to the font');

并在控制器中捕获它。

实际上,更好的方法是甚至不向用户显示具有相同类型和字体的设置,因此他甚至没有选择的选项。但是也需要这种幕后验证。