检查空值保存到多个表与ZF2
我使用ZF2和mysql的时候,但问题是平台无关的。我有一个数据传输对象Organization
从html表单获取水分。 OrganizationMapper
具有save
方法,该方法(1)得到Organization
作为参数和(2)一个填充一个接一个地对夫妇数据库表。检查空值保存到多个表与ZF2
假设第一个表格被填满,但第二个并不是因为Organization
的其中一个属性没有设置(对列没有空限制)。用户遇到错误,但第一个表已经填满。如果他试图再次提交表单,但是这次填充了所有的html字段,所有表格都会被填满,但第一个表格中有一个未使用的行。
我怎么能避免这种情况?
我想到在0123per的映射器的save
方法中检查empty
值,但它看起来并不高雅。我知道ZF2中的InputFilter
验证,但是这些验证用户在表单中的输入,当php代码与数据库通信时,它们不检查事情。
任何帮助?
最好的办法是启动它写入数据库之前验证所有数据。
我没有使用ZF2并且这种解决方案实际上是架构相关的,所以你需要检查ZF2文档。例如,在Yii中,您只需为模型的每个字段定义验证规则,因此您可以确保在开始将其保存到数据库之前包含所有数据,可能在Zend中可能有类似的情况。
请注意,验证并不意味着只检查空值,您可能需要验证不同的内容,例如:“电子邮件是正确的电子邮件,如[email protected]”,“名称不为空”,“名称长度大于3个字符“,”名称长度小于1000个字符“等。
对于Yii的它大致是这样的:
class Organization extends ActiveRecord {
...
// here we define the validation rules
public function rules() {
return [
// name is required
['name', 'required'],
// check min/max length
['name', 'string', 'min' => 3, 'max' => 12],
// check if email is valid
['email', 'email']
];
}
}
现在你可以做$organization->validate()
以确保一切是正确的(也当你做$organization->save()
规则将保存到数据库前要检查)。
还有一解决方案从不一致的数据保护方法是使用交易。如果您写入多个表格,无论如何您都需要它们,即使您验证了所有内容。意想不到的事情发生,所以它是更好地保护您节省这样的代码(伪代码):
$transaction->start();
try {
$table1->writeSomeData();
$table2->writeMoreData();
$transaction->commit();
} (catch Exception $e) {
$transaction->rollback();
}
再次,检查你的框架文件,它可能支持这种以某种方式。