使用 ZF2 保存到多个表时检查空值

Checking for empty values when saving into multiple tables with ZF2

我正在使用 ZF2 和 mysql,但问题与平台无关。我有一个数据传输对象 Organization,它从 html 表单中获取水分。 OrganizationMapper 有一个 save 方法,它 (1) 获取 Organization 作为参数,并且 (2) 依次填充一对数据库 table。

假设第一个 table 填充正常,但第二个没有填充,因为未设置 Organization 的属性之一(不是列上的空约束)。用户收到错误消息,但第一个 table 已填满。如果他尝试再次提交表单,但这次所有 html 字段都已填写,所有 table 都可以填写,但第一个有一个以前未使用的行。

我怎样才能避免这种情况?

我想在映射器的 save 方法中使用 if 检查 empty 值,但它看起来并不优雅。我知道 ZF2 中的 InputFilter 验证,但这些检查表单中的用户输入,当 php 代码与数据库通信时,它们不检查内容。

有什么帮助吗?

最好的方法是在开始将数据写入数据库之前验证所有数据。

我没有使用 ZF2,这个解决方案实际上是依赖于框架的,所以你需要查看 ZF2 文档。例如,在 Yii 中,您只需为模型的每个字段定义验证规则,这样您就可以确保 Organization 包含所有数据,然后再开始将其保存到数据库中,Zend 中可能有类似的事情。

请注意,验证并不仅仅意味着检查空值,您可能需要验证不同的内容,例如:"email is correct email like xxx@yyy.com"、"name is not empty"、"name length is more than 3 chars"、"name length is less than 1000 chars"等等。

对于 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();
 }

再次检查您的框架文档,它可能以某种方式支持这一点。