当$ useTable = false时,CakePHP模型验证不起作用吗?

时间:2015-10-12 12:49:14

标签: php validation cakephp model

最近我参与了两个CakePHP Web应用程序。第一个我使用CakePHP格式的表需要它们,验证似乎正常工作。对于第二个应用程序,我正在使用$useTable = false,而是使用[模型名称] - > query()函数来执行控制器内部的SQL存储过程以保存和更新数据,但是遇到了模型验证的几个问题。

示例1: 我有一个名为'WeekName'的字段,数据库中的字符数限制为50个字符。我的模型验证设置如下所示,它与Cake文档相匹配,但它很高兴地尝试保存超过50个字符的字符串长度。

'WeekName' => array(
        'allowEmpty' => false,
        'rule' => array('maxLength', '50'),
        'message' => 'No more than 50 characters long.'
    ),`

示例2: 我最近创建了一个关于添加验证的问题,其中两个字段之一需要包含数据以便控制器处理数据。在尝试了几条建议后,没有任何工作,它根本不检查验证,只是继续处理控制器函数中的代码。

Link to posted question

所有这些问题让我想知道在$useTable = false时是否忽略了模型验证,以及是否有意这样做,如果有这种情况我可以启用模型验证。

如果有人对此问题有任何见解,可能会导致什么问题,或者是否有可能的解决方案会受到高度赞赏。

谢谢。

备注:

使用CakePHP 2.7进行开发

1 个答案:

答案 0 :(得分:2)

CakePHP验证规则适用于没有表格的模型。但是,在使用$this->ModelName->query()保存数据之前,您似乎未对数据运行验证。与save()不同,query()在保存之前不会自动运行验证,因为它不使用CakePHP的回调来测试数据。

除非确实有必要,否则我要避免使用query()手动查询数据库并使用save(),但如果您需要这样做,则必须手动验证: -

$this->ModelName->set($this->request->data);
if ($this->ModelName->validates()) {
    // Save your data using query()
    $this->ModelName->query();
} else {
    // Validation failed
}

这会根据模型设置数据,然后根据模型的验证规则运行设置数据。如果成功,它将运行您的query()

有关详细信息,请参阅文档中的Validating Data from the Controller